例外(Exception)

例外とは,プログラム中に発生した問題を通知するために,実行時に生成されるオブジェクトのことです.例外が発生する典型的なケースは,整数をゼロで乗算した,配列のインデックスが負の値または配列の長さを超える値だった,ファイルが見つからなかった,数値の形式が不正だった,URLが壊れていた,などの場合です.

この種の問題の処理は,Java言語の重要な機能です.例外を適切に処理することで,プログラムの構造はより堅牢になります.

例外処理

Java言語では,プログラムの実行中に発生した例外を,ユーザの用意した処理ルーチンで処理することができます.それには,try/catch/finally文を用います.
try {
// 例外を検出する文をここに記入
}
catch {
// 例外が発生したときの処理をここに記入
}
finally {
// 例外発生の有無に関わらず必ず実行する文をここに記入
}

例題 9..1   例外処理
\framebox{
\begin{minipage}{13.65cm}
{\rm 次のプログラムを実行すると,どのような情報が表示されるか答えなさい.}
\end{minipage}}

class ClassCast
{
  public static void main(String[] args)
  {
    try
    {
      Object obj = new Integer("85");
      System.out.println("Before cast");
      Double dobj = (Double)obj;
      System.out.println("After cast");
    }
    catch(Exception ex)
    {
      System.out.println(ex);
    }
  }
}

実行結果

\begin{figure}\centering
\includegraphics[width=7.8cm]{JAVAFIG/ClassCast.eps}
\end{figure}

ここで,用いたcatch(Exception ex)は,とりあえずどのような例外が発生しているか分からないが,全ての例外を捕捉したいときに用います.

チェック例外の処理

例外には,チェック例外と非チェック例外の2つがあります.チェック例外とは,正しく記述されているかどうかをコンパイラがチェックするものです.非チェック例外は例外の有無をコンパイラがチェックすることはないものです.なぜ,このような違いがあるかといいますと,チェック例外とは,コンストラクタ/メソッドを実行すると発生する可能性がある例外で,非チェック例外とは,Javaの通常の式の実行で発生する可能性がある例外です.

非チェック例外の代表例としてゼロ除算(Arithmetic Exception)があります. これは,
a = b/c;
という,ごくありふれた式文の中で発生する可能性があります.Javaではこのような例外はコンパイラには判断させず,プログラマ自身が対処すべきであるとしています.

例題 9..2   メソッド内での例外処理
\framebox{
\begin{minipage}{13.65cm}
{\rm 次のプログラムを実行すると,どのような情報が表示されるか答えなさい.}
\end{minipage}}

import java.io.*;
class ThrowsException
{
  public static void main(String[] args)
  {
    fileopen();
  }
  public static void fileopen()
  {
    try
    {
      FileReader f = new FileReader("yokota.txt");
    }
    catch(Exception ex)
    {
      System.out.println(ex);
    }
  }
}

実行結果

\begin{figure}\centering
\includegraphics[width=14cm]{JAVAFIG/FileException.eps}
\end{figure}

メソッド外での例外処理

もし例外を検出したメソッド内で処理をしないときは,自分を呼び出した側に例外処理を依頼します.その場合はthrowsキーワードを用いてスロー宣言をします.これは,このメソッドから例外が発生することがある.したがって呼び出し側では責任を持って例外処理して欲しいということを表明するものです.

例題 9..3   メソッド外での例外処理
\framebox{
\begin{minipage}{13.65cm}
{\rm 次のプログラムを実行すると,どのような情報が表示されるか答えなさい.}
\end{minipage}}

import java.io.*;
class ThrowsException
{
  public static void main(String[] args)
  {
    try
    {
      fileopen();
    }
    catch(Exception ex)
    {
      System.out.println(ex);
    }
  }
  public static void fileopen() throws Exception
  {
    FileReader f = new FileReader("yokota.txt");
  }
}

実行結果

\begin{figure}\centering
\includegraphics[width=14cm]{JAVAFIG/ThrowsException.eps}
\end{figure}