大変お世話になっております。
反逆する武士
uematu tubasaです。
初回投稿日時:2023年7月2日(令和5年7月2日)
この記事はJavaの例外処理の基本的なことは理解していることを前提に記述しております。
本日2回目の記事です。
例外処理のcatchブロックが複数の場合の問題
【問題】以下のプログラムをコンパイル、実行したときの結果としてどうなるのか。
public class SampleException extends Exception{}
public class SubSampleException extends SampleException{}
public class Main{
public static void main (String[] args){
try{
sample();
sub();
}catch(SampleException e){
System.out.println("A");
}catch(SubSampleException e){
System.out.println("B");
}
}
private static void sample() throws SampleException {
throw new SampleException();
}
private static void sub() throws SubSampleException {
throw new SubSampleException();
}
}
【回答】コンパイルエラーになる。
Javaの例外処理のcatchブロックは複数記述することができます。
catchブロックを複数記述した場合、tryブロック内で例外がスローされると、記述した順にcatchブロックでキャッチする例外の種類が評価されます。
上記の問題においては、SubSampleExceptionがスローされたとき、1つ目のcatchブロックはこのインスタンスへの参照をスーパークラスであるSampleException型で受け取ることが可能です。
したがって、2つ目のcatchブロックは到達し得ないソースコードになります。
その結果、コンパイルエラーになります。
エラーに関する基礎知識を問う問題
Javaにおけるエラーとは、プログラムからは回復不能なトラブルが発生したことを指します。
例えば、実行マシンのメモリが不足していたり、データが保存されているディスクに対する読み取りや書き込みの権限が無かったり、ネットワーク接続ができないなど。
要するに、エラーはプログラムの実行環境に例外が発生したときにスローされる。
エラーはErrorクラスが表しますが、実際に使われるのは、そのサブクラスです。
例えば、errorを継承したサブクラスには、OutOfMemoryErrorやNoClassDefFoundError、StackOverflowErrorがあります。
なお、エラーに分類するためには、Errorを継承する必要があります。
エラーはtry-catchしたり、throwsで宣言したりする必要はありません。
なおエラーは例外処理をすることを求められていないだけであって、キャッチして処理することが可能です。
起動パラメータを設定しない場合の例外問題
【問題】以下のプログラムを確認してください。
public class Main {
public static void main(String[] args){
System.out.println(args[0].length);
}
}
このプログラムを以下のコマンドで実行した場合、どうなるでしょうか。
> java Main
【回答】ArrayIndexOutOfBoundsExceptionが発生する。
【解説】mainメソッドの引数で参照しているStringの配列はmainメソッド実行前にJVMが生成したものです。
この問題のようにjavaコマンド実行時に起動パラメータを記述しなかった場合であっても、要素を1つも持っていないString配列型オブジェクトが生成されます。
その参照がmainメソッドの引数に渡されます。
この問題においては、String配列型オブジェクトの1番目にアクセスしているので、ArrayIndexOutOfBoundsExceptionが発生します。
以上です。