22‐1
A
____|____
| |
B C
| __|___
(X) | |
(Y) D
|
(Z)
(1) 上記図は例外クラスの継承関係の図です。AからDに当てはまる例外クラスを答えなさい。
(2) 上記図で、例外に対する対処がないとコンパイルが通らない系列は(X)から(Z)のうちどれですか?
(3) (2)の系列の例外を何といいますか?
(4) (2)の系列以外の例外を何といいますか?
22‐2
次のクラスをコンパイルするとエラーになります。その理由を答えなさい。
ヒント:Thread.sleep()はInterruptedExceptionという例外を発生する可能性があり、これはExceptionの直接のサブクラス。
------------------------------------------------------------------------
class Exer22_02 {
void met(){
System.out.println("start");
Thread.sleep(3000);
System.out.println("end");
}
}
------------------------------------------------------------------------
22‐3
上記Exer22_02をtry ... catchを使ってコンパイルが通るように修正し、Exer22_03というクラスを作成しなさい。なお、tryで囲むのは最小限の処理にしなさい。
また、例外発生時の処理は例外情報を出力するだけでよい。
22‐4
上記Exer22_03のインスタンスを生成し、そのmet()メソッドを呼び出すという処理を行うExer22_04というクラスを作成・コンパイル・実行しなさい。
22‐5
上記Exer22_02をthrowsを使ってコンパイルが通るように修正し、Exer22_05というクラスを作成しなさい。
22‐6
上記Exer22_05のインスタンスを生成し、そのmet()メソッドを呼び出すという処理を行うExer22_06というクラスを作成・コンパイル・実行しなさい。
22‐7
下記のクラスは実行時のコマンドライン引数によって、次の3つの例外を発生する可能性があります。
・コマンドライン引数を指定しなかった場合 … ArrayIndexOutOfBoundsException(配列の存在しない添字番号を使用した)
・数字でないものを指定した場合 … NumberFormatException(数字に変更できなかった)
・0を指定した場合 … ArithmeticException(0で割り算をした)
・1桁の数字を指定した場合 … StringIndexOutOfBoundsException(文字列の存在しない添字番号を使用した)
これらはすべてExceptionのサブクラスです。
------------------------------------------------------------------------
class Exer22_07 {
public static void main(String[] args){
int num = Integer.parseInt(args[0]);
System.out.println("1000を割った結果 : " + 1000 / num);
System.out.println("2桁目の数字 : " + args[0].charAt(1));
}
}
------------------------------------------------------------------------
上記クラスは例外対処をしていませんが、次のように例外対処をしなさい。
また、args[0].charAt(1)の部分は気にしないでください。
・ArrayIndexOutOfBoundsExceptionが発生した場合は、"コマンドライン引数を指定して下さい"と出力する。
・NumberFormatExceptionが発生した場合は、"数字を指定して下さい"と出力する。
・それ以外の例外が発生した場合は"2桁以上の数字を指定して下さい"と出力する。
22‐8
次のクラスをコンパイルするとエラーになります。その理由を答えなさい。また、コンパイルが成功するように修正しなさい。
------------------------------------------------------------------------
class Exer22_08 {
public static void main(String[] args){
try{
int num = Integer.parseInt(args[0]);
System.out.println("1000を割った結果 : " + 1000 / num);
System.out.println("2桁目の数字 : " + args[0].charAt(1));
}catch(Exception ex){
ex.printStackTrace();
}catch(StringIndexOutOfBoundsException ex){
ex.printStackTrace();
}
}
}
------------------------------------------------------------------------