実際、その違いはかなり大きいです。
最初のものを取り、印刷の後に行を追加します。
public class ExceptionExample {
private static String str;
public static void main(String[] args) {
System.out.println(str.length());
System.out.println("Does this execute?");
}
}
Does this execute?
例外がコードのフローを中断し、キャッチされない場合は停止するため、出力されないことがわかります。
一方で:
public class ExceptionExample {
private static String str;
public static void main(String[] args) {
try {
System.out.println(str.length());
} catch(NullPointerException npe) {
npe.printStackTrace();
}
System.out.println("Does this execute?");
}
}
スタック トレースと Does this execute?
. 例外をキャッチするということは、「ここでこれを処理して実行を続行する」と言っているようなものだからです。
もう1つの注意点として、catch
ブロックはエラー回復が発生する場所であるため、エラーが発生しても回復できる場合は、そこに回復コードを配置します。
編集:
エラー回復の例を次に示します。に存在しないファイルがあるとしますC:\nonexistentfile.txt
。開いてみて、見つからない場合は、見つからないというメッセージをユーザーに表示します。FileNotFoundException
これは、ここで生成されたものをキャッチすることで実行できます。
// Here, we declare "throws IOException" to say someone else needs to handle it
// In this particular case, IOException will only be thrown if an error occurs while reading the file
public static void printFileToConsole() throws IOException {
File nonExistent = new File("C:/nonexistentfile.txt");
Scanner scanner = null;
try {
Scanner scanner = new Scanner(nonExistent);
while (scanner.hasNextLine()) {
System.out.println(scanner.nextLine());
}
} catch (FileNotFoundException ex) {
// The file wasn't found, show the user a message
// Note use of "err" instead of "out", this is the error output
System.err.println("File not found: " + nonExistent);
// Here, we could recover by creating the file, for example
} finally {
if (scanner != null) {
scanner.close();
}
}
}
したがって、ここで注意すべき点がいくつかあります。
FileNotFoundException
スタック トレースを出力する代わりに、カスタム エラー メッセージをキャッチして使用します。エラー メッセージは、スタック トレースを出力するよりも明確でユーザー フレンドリーです。GUI アプリケーションでは、コンソールがユーザーに表示されない場合があるため、代わりにユーザーにエラー ダイアログを表示するコードである可能性があります。ファイルが存在しなかったからといって、コードの実行を停止する必要があるわけではありません。
throws IOException
.と一緒にキャッチするのではなく、メソッド シグネチャで宣言しFileNotFoundException
ます。この特定のケースではIOException
、ファイルが存在するにもかかわらず読み取りに失敗すると、ここで がスローされます。この方法では、ファイルの読み取り中に発生したエラーの処理は私たちの責任ではないと言っています。これは、回復不能なエラーを宣言する方法の例です (回復不能とは、ここでは回復不能を意味します。 を呼び出したメソッドなど、さらに上のどこかで回復可能である可能性がありますprintFileToConsole
)。
- ここで誤って
finally
ブロックを紹介してしまったので、その機能について説明します。Scanner
が開かれ、ファイルの読み取り中にエラーが発生した場合、Scanner
が閉じられることが保証されます。これは多くの理由で重要です。最も顕著なのは、ファイルを閉じないと Java がファイルをロックしたままになるため、アプリケーションを終了しないとファイルを再度開くことができないことです。