「こんにちは、アミーゴ。今日はとても興味深いレッスンをします。例外についてお話します。例外とは、プログラム内のエラーを処理できるようにする特別なメカニズムです。発生する可能性のあるエラーの例をいくつか示します。プログラム内:
1. ハードドライブが完全にいっぱいの場合、プログラムはファイルに書き込もうとすることがあります。
2. プログラムは、null 参照を格納している変数のメソッドを呼び出そうとする可能性があります。
3. プログラムは数値を 0 で除算しようとする可能性があります。」
これらのアクションはすべてエラーになります。この場合、コードを実行し続けるのは意味がないため、通常、プログラムは即座に終了します。
"なぜ?"
「車が道路から外れて崖から落ちそうになった場合、ハンドルを回し続けることに意味があるでしょうか?」
「それでは、プログラムの実行を停止する必要がありますか?」
「はい。少なくとも、これは以前は起こったことです。エラーが発生するとプログラムが終了します。」
「それは非常に賢いアプローチです。」
「しかし、プログラムを実行し続けてみたほうが良いのではありませんか?」
「はい。Word に膨大な量のテキストを入力して保存したとします。保存操作が失敗しても、プログラムがすべて問題ないと信じ込ませたらどうしますか? そして、入力を続けます。それは愚かなことでしょう。それ?"
「はい。」
「その後、プログラマは興味深い解決策を思いつきました。各関数はその作業のステータスを返すことになりました。0 は期待どおりに動作したことを意味します。それ以外の値は何らかのエラーが発生したことを意味し、戻り値はエラー コードでした。」
「しかし、このアプローチには欠点もあります。(!) 関数を呼び出すたびに、リターン コード (数値) をチェックする必要があります。まず、これは不便です。エラー処理コードはめったに実行されませんが、含める必要があります。」第二に、関数は異なる値を返すことがよくありますが、それらをどうすればよいでしょうか?」
「そうですね。それは私も考えました」
「その後、例外とエラー処理メカニズムの形で明るい未来が到来しました。その仕組みは次のとおりです。
1.エラーが発生すると、Java マシンは特別なオブジェクト (例外) を作成し、そこにすべてのエラー情報を保存します。エラーごとに異なる例外があります。
2. 例外が発生すると、プログラムは現在の関数を直ちに終了し、次の関数を終了し、メイン メソッドを終了するまで続きます。その後、プログラムは終了します。プログラマは、Java マシンが「コールスタックを巻き戻す」とも言うかもしれません。」
「しかし、プログラムは必ずしも終了するとは限らないと言いましたね。」
「はい、例外をキャッチする方法があるからです。適切な場所に特別なコードを記述して、関心のある例外をキャッチし、それに対して何かを行うことができます。これは重要なことです。」
「これを支援するために、特別なtry-catch構造があります。これがどのように機能するかは次のとおりです。」
例外 (0 による除算) をキャッチして動作を続けるプログラムの例。 |
---|
|
画面出力: |
|
「しかし、なぜ画面に「メソッド1を呼び出した後。これは決して表示されません」が表示されないのでしょうか?」
「ご質問いただきありがとうございます。25 行目では、0 で除算していますが、これによりエラー、つまり例外が発生します。Java マシンは、エラーに関する情報を含むArithmeticExceptionオブジェクトを作成します。このオブジェクトが例外です。」
「メソッド内で例外が発生しますmethod1
。これにより、メソッドはただちに終了します。try -catchブロックがない場合は、メインメソッドが終了します。」
" tryブロック内で例外が発生した場合、その例外はcatchブロックでキャッチされます。tryブロック内のコードの残りの部分は実行されません。代わりに、catchブロックの実行が開始されます。 "
"理解できません。"
「言い換えれば、コードは次のように動作します。
1. tryブロック内で例外が発生した場合、例外が発生した場所でコードの実行が停止され、catchブロックの実行が開始されます。
2. 例外が発生しない場合、try ブロックは最後まで実行され、catchブロックは実行されません。」
"は?"
「各メソッド呼び出しの後に、メソッドが正常に返されたか、それとも例外の結果として突然終了したかを確認すると想像してください。例外がある場合は、catch ブロック (存在する場合) を実行して例外をキャッチします。 catch ブロックがない場合は、現在のメソッドを終了し、呼び出したメソッドが同じチェックを実行します。」
「もう分かったと思います。」
"素晴らしい。"
「catch ステートメント内の 'Exception' は何を意味しますか?」
"すべての例外は、Exception クラスを継承するクラスです。catchブロックで例外クラスを指定することによって特定の例外をキャッチすることも、共通の親クラスである Exception を指定することによってすべての例外をキャッチすることもできます。これにより、必要なエラーをすべて取得できます。変数 e からの情報 (例外オブジェクトへの参照を保存します)。
「素晴らしいですね! 私のメソッドでさまざまな例外が発生した場合、それらを別の方法で処理できますか?」
「できるだけでなく、そうすべきです。次のようにして実行できます。」
public class ExceptionExample2
{
public static void main(String[] args)
{
System.out.println("Program starts");
try
{
System.out.println("Before calling method1");
method1();
System.out.println("After calling method1. This will never be shown");
}
catch (NullPointerException e)
{
System.out.println("Null reference. Exception has been caught");
}
catch (ArithmeticException e)
{
System.out.println("Division by zero. Exception has been caught");
}
catch (Exception e)
{
System.out.println("Any other errors. Exception has been caught");
}
System.out.println("Program is still running");
}
public static void method1()
{
int a = 100;
int b = 0;
System.out.println(a / b);
}
}
「tryブロックは複数のcatchブロックと組み合わせることができ、それぞれが指定された種類の例外をキャッチします。」
「理解できた気がします。まだ自分では書けませんが、コードで出てきたら怖くないです。」
GO TO FULL VERSION