プログラムの実行中にエラーが発生する可能性があります。これは、初心者から本物のプロまで、すべてのプログラマーにとって共通の問題です。すべてのエラーが開発者の過失によって発生するわけではありません。それらの中には予測が困難なものもあり、不可能な場合もあります。たとえば、プログラムのダウンロード中に、ネットワーク接続が突然切断されたり、電源が落ちたりすることがあります。このような状況は例外と呼ばれます。Try と catch は、例外を処理するために使用される構築の一部です。
Javaのtry and catchブロック
エラーが発生すると、通常、Java は停止し、エラー メッセージが生成されます。このプロセスは「Java が例外をスローする」と呼ばれます。Java は、例外を処理するための特別な機能を提供します。そのうちの 1 つは、try...catch...finally 構築です。Try ブロック、Catch ブロック、Finally ブロックの構文は次のとおりです。//try block
try {
// Block of code to try
}
//try catch
catch(Exception e) {
// Block of code to handle errors
}
finally {
// Optional block of code
}
try ブロックで例外が発生すると、制御は catch ブロックに渡され、例外を処理できます。そのようなブロックが見つからない場合は、未処理の例外メッセージがユーザーに表示され、それ以降のプログラムの実行は停止されます。このような緊急停止を防ぐために、try..catch ブロックを使用する必要があります。
try、catch、finally、throws キーワードについて簡単に説明します。
Java の例外処理は、プログラム内での次のキーワードの使用に基づいています。- try — 例外が発生する可能性のあるコードのブロックを定義します。
- catch — 例外が処理されるコードのブロックを定義します。
- finally — オプションのコード ブロックを定義しますが、存在する場合は、try ブロックの結果に関係なく実行されます。
- throw — 例外を発生させるために使用されます。
- throws — メソッドが例外をスローする可能性があることを警告するためにメソッド シグネチャで使用されます。
Try-Catch 構築の簡単な例
配列を含むプログラムがあるとします。public class TryTest {
public static void main(String[] args) {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
}
}
存在しないインデックスを持つ配列要素にアクセスしようとしているため、プログラムはエラーで終了します。
スレッド "main" java.lang.ArrayIndexOutOfBoundsException での例外: days.TryTest.main(TryTest.java:6) でインデックス 7 が長さ 5 の範囲外です。プロセスは終了コード 1 で終了しました。
このプログラムを変更して、try-catch を使用してこの例外を処理しましょう。最初に try ブロックが来て、その後に catch ブロックが来ます。
//try catch example
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (Exception myEx) {
System.out.println("The exception was handled...");
}
System.out.println("This is the end of the program...");
}
}
これで出力が変わりました。
例外が処理されました... これでプログラムは終了です... 終了コード 0 でプロセスが終了しました 終了コード 0 でプロセスが終了しました
この場合、プログラムは正常に完了しており、画面にメッセージが表示されます。プログラムの正しい終了はプロセスの最後にコード 0 で示されますが、正しくない場合は 1 によって通知されます。try...catch ブロックを使用する場合、try ステートメントと catch ステートメントの間のすべてのステートメントが最初に実行されます。try ブロックで例外が発生した場合、通常の実行順序は停止し、catch ステートメントに進みます。したがって、プログラムの実行が数値 [7]=8 に達すると、この行でプログラムは停止し、catch ブロックに進みます。この場合、変数 myEx を Exception 型で宣言しました。これはすべての例外の基本クラスであるため、異なる場合があります。たとえば、スタック オーバーフローの原因となる例外があり、今回の場合のように配列のインデックス付けを超え、Null をポイントするなどの例外があります。例外の種類を推測していなかったら、プログラムも誤って終了していたでしょう。ただし、例を簡単にするために Exception タイプを選択しました。これはすべての例外の基本クラスです。したがって、catch ステートメント (Exception myEx) は、ほとんどすべての例外を処理します。この場合の例外の処理 catch ブロックが完了した後、プログラムは作業を続行し、catch ブロックの後に他のすべての命令を実行します。発生した例外を確認したい場合は、プログラムにメソッド呼び出しのスタック トレースを出力させることができます。これは、キャッチされない例外が発生したときに JVM が行うことです。JVM はプログラムの実行を停止し、finally ブロックのコード (存在する場合) を実行した後にスタック トレースを出力します。
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (Exception myEx) {
myEx.printStackTrace();
}
System.out.println("This is the end of the program...");
}
}
この場合の例外の処理は、Exceptionクラスで定義されたprintStackTrace()メソッドを使用してエラー トレース スタックをコンソールに出力することになります。
java.lang.ArrayIndexOutOfBoundsException: days.TryTest.main(TryTest.java:7) で長さ 5 の範囲外のインデックス 7 が見つかりました。これでプログラムは終了です... プロセスは終了コード 0 で終了しました
ただし、プログラムは正常に終了しました。
ついに!捕まえた後
この例と例外処理のキーワードの定義の中で、finally ブロックについて言及しました。これはオプションですが、存在する場合は、try ブロックの結果に関係なく実行されます。例外の種類を NullPointerException に変更しましょう。public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (NullPointerException myEx) {
System.out.println("The exception was handled...");
}
finally{
System.out.println(" finally");
}
System.out.println("This is the end of the program...");
}
}
出力は次のとおりです。
スレッド「メイン」java.lang.ArrayIndexOutOfBoundsException での例外: days.TryTest.main(TryTest.java:7) で長さ 5 の範囲外のインデックス 7 が最終的に終了コード 1 でプロセスが終了しました
ちなみに、例外の種類を正しく指定することもできます。ここでは IndexOutOfBoundsException です。
public class TryTest {
public static void main(String[] args) {
try {
int[] myArray = new int[5];
myArray[7] = 8;
System.out.println(myArray[7]);
} catch (IndexOutOfBoundsException myEx) {
System.out.println("The exception was handled...");
}
finally{
System.out.println(" finally");
}
System.out.println("This is the end of the program...");
}
}
この場合、出力は次のようになります。
例外が処理されました...ついにこれでプログラムは終了です...プロセスは終了コード 0 で終了しました
例外はどのように機能するのでしょうか?
重要なのは、これらすべての単語 (catch、throw、throws) は java.lang.Throwable またはその子孫でのみ使用できるということです。たとえば、次のようにすることができます。public class MyClass {
public static void main(String[] args) {
try {
} catch (Throwable thr) {
}
}
}
ただし、次のようにすることはできません。
public class MyClass {
public static void main(String[] args) {
try {
} catch (String thr) {
}
}
}
GO TO FULL VERSION