Javaでtry-catchブロックの中にさらにtry-catchブロックを宣言することはできる?
はい、可能です。Javaでは、try-catchブロックの中に別のtry-catchブロックを宣言することができます。これを「ネストされたtry-catchブロック」と呼びます。
ネストされたtry-catchブロックの仕組み
- 内側のtry文が特定の例外に対して対応するcatch文を持っていない場合、制御は次のtry文のcatchハンドラに移され、一致するcatch文が探されます。
- この処理は、いずれかのcatch文が成功するまで、あるいはネストされたすべてのtry文が終了するまで繰り返されます。
- どのcatch文とも一致しなかった場合、最終的にJavaランタイムシステムが例外を処理します。
- ネストされたtryブロックを使用する場合、まず内側のtryブロックが実行されます。内側のtryブロックでスローされた例外は、対応するcatchブロックで捕捉されます。一致するcatchブロックが見つからなければ、外側のtryブロックのcatchブロックが順番にチェックされ、ネストされたすべてのtry文が尽きるまで探索が続けられます。それでも一致するブロックが見つからない場合、Javaランタイム環境(JRE)が例外を処理します。
基本構文
try {
文1;
文2;
try {
文1;
文2;
}
catch(Exception e) {
// 対応する例外を捕捉
}
}
catch(Exception e) {
// 対応する例外を捕捉
}
.............コード例
以下の例では、外側のtryブロックでファイルを開き、その中にゼロ除算を行う内側のtryブロックを配置しています。
import java.io.*;
public class NestedTryCatchTest {
public static void main(String args[]) throws IOException {
int n = 10, result = 0;
try { // 外側のtryブロック
FileInputStream fis = null;
fis = new FileInputStream(new File(args[0]));
try { // 内側のtryブロック
result = n / 0;
System.out.println("The result is" + result);
}
catch (ArithmeticException e) { // 内側のcatchブロック
System.out.println("Division by Zero");
}
}
catch (FileNotFoundException e) { // 外側のcatchブロック
System.out.println("File was not found");
}
catch (ArrayIndexOutOfBoundsException e) { // 外側のcatchブロック
System.out.println("Array Index Out Of Bounds Exception occured ");
}
catch (Exception e) { // 外側のcatchブロック
System.out.println("Exception occured" + e);
}
}
}実行結果
このプログラムをコマンドライン引数なしで実行すると、args[0]へのアクセス時点で配列の範囲外アクセスが発生するため、以下の出力が得られます。
Array Index Out Of Bounds Exception occured
このように、引数不足によるArrayIndexOutOfBoundsExceptionは外側のcatchブロックで捕捉されます。コマンドライン引数を正しく指定すればファイルが読み込まれ、今度は内側のtryブロックが実行されて、ゼロ除算によるArithmeticExceptionが内側のcatchブロックで処理されるという流れになります。
-
Javaでcatchブロックなしのtryブロックは使える?finallyとの組み合わせを解説
はい、可能です。Javaでは、tryブロックにcatchブロックを付けずに、finallyブロックと組み合わせて使用することができます。finallyブロックは、tryブロック内で例外が発生したかどうかにかかわらず必ず実行されるという特徴があります。唯一の例外は System.exit() を呼び出した場合です。この場合、JVM自体が終了するため、finallyブロックは実行されません。この「try-finally」構文は、例外処理を行わなくても、後処理(リソースの解放や接続のクローズなど)を確実に実行したい場合に役立ちます。例1:基本的なtry-finally構文public class T
-
Javaでmainメソッドをprivateとして宣言することはできる?
結論から言うと、Javaではmainメソッドをprivateとして宣言すること自体は可能です。コンパイルもエラーなく正常に完了します。しかし、プログラムを実行しようとすると、JVM(Java仮想マシン)が「mainメソッドがpublicではない」ことを検出し、実行時エラーが発生します。これは、JVMがプログラムのエントリーポイントとしてpublic static void main(String[] args)というシグネチャを厳密に探すためです。コード例class PrivateMainMethod { private static void main(String args[]){