以下のプログラムには、題意を明確にするためにあえて無意味な変数名を使用しています。
また、便宜的に複数のクラスを1つのファイルに書いていることがあります。
1.プリントスタックトレースの解読
以下のソースコードを実行してエラーのプリントスタックトレースを読み、例外発生時にどこを見れば素早くエラーのあるソースコードにたどり着けるかを答えなさい。
package p13;
public class Q01 {
public static void main(String[] args) {
String str = "Java";
try {
System.out.print("J");
Integer.parseInt(str);
System.out.print("A");
} catch (NumberFormatException e) {
System.out.print("V");
e.printStackTrace();
}
System.out.println("a");
}
}
2.try...catch...finally 文
以下のソースコードを実行したとき何が出力されるかを答えなさい。
package p13;
class ExceptionTest1 {
public void func(int i, int j) {
try {
System.out.print("J");
int k = i / j;
System.out.print("A");
} catch (ArithmeticException e) {
System.out.print("V");
} finally {
System.out.print("a");
}
}
}
public class Q02 {
public static void main(String[] args) {
ExceptionTest1 a = new ExceptionTest1();
a.func(1, 2);
}
}
※便宜的に2つのクラスを1つのファイルに記述しているが本来はクラスごとにファイルを分けるべきである。
3.ArithmeticException
上記と同じパッケージに以下のJavaファイルを追加して実行したとき何が出力されるかを答えなさい。
package p13;
public class Q03 {
public static void main(String[] args) {
ExceptionTest1 a = new ExceptionTest1();
a.func(1, 0);
}
}
4.NullPointerException
以下のソースコードを実行したとき何が出力されるかを答えよ。
package p13;
public class Q04 {
public static void main(String[] args) {
int[] array = null;
System.out.print("J");
try {
array[0] = 0;
System.out.print("A");
} catch (ArithmeticException e) {
System.out.print("V");
} catch (NullPointerException e) {
System.out.println("a");
}
}
}
5.NumberFormatException
以下のソースコードを実行したとき何が出力されるかを答えよ。
package p13;
public class Q06 {
public static void main(String[] args) {
String str = "Java";
try {
System.out.print("J");
Integer.parseInt(str);
System.out.print("A");
} catch (NumberFormatException e) {
System.out.print("V");
}
System.out.println("a");
}
}
6.ArrayIndexOutOfBoundsException
以下のソースコードを実行したとき何が出力されるかを答えよ。
package p13;
public class Q05 {
public static void main(String[] args) {
int[] array = new int[3];
try {
for (int i = 0; i <= 3; i++) {
array[i] = i;
System.out.print(array[i]);
}
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("配列の境界を越えました!");
}
}
}
7.throwとthrowsキーワード
以下のプログラムはこのままではエラーが出て実行できない。
mainメソッド内にtry catch文を記述する方法とmainメソッドにthrowsキーワードを追記する方法で実行できるようにしなさい。
なお、IDEの便利機能を使って良い。
(実行しても例外が発生することにはなるが。。。)
package p13;
public class Q07 {
public static void main(String[] args){
ThrowTest.aMethod();
}
}
class ThrowTest {
static void aMethod() throws Exception {
throw new Exception();
}
}
※便宜的に2つのクラスを1つのファイルに記述しているが本来はクラスごとにファイルを分けるべきである。
8.数当てゲームの例外処理
以前作成した数当てゲームにおいて、数値以外が入力された場合の例外処理を加えなさい。
なお、以下の出力例のように数値以外を入力した回数も1回と数えること。
ヒント1:まずは例外をわざと発生させて例外の正体を掴みましょう。
ヒント2:原因不明の事象が出たらインターネットで対処方法を調べなさい。
秘密の答え:84 5回以内に数を当ててね。3回以内ならすごいことだよ。 キーボードから数値を入力してください>a 数値を入れてね。 キーボードから数値を入力してください>a 数値を入れてね。 キーボードから数値を入力してください>a 数値を入れてね。 キーボードから数値を入力してください>84 あたり。まあまあすごいよ。 |
9.例外の種類に応じて処理を書き分ける
以下のクラスDividerを使って割り算の処理をするプログラムを作成しています。
package p13;
import java.util.Scanner;
public class Divider {
int num1;
int num2;
Scanner sc = new Scanner(System.in);
public void setNum1() {
System.out.println("割られる数を入力してください");
this.num1 = Integer.parseInt(sc.nextLine());
}
public void setNum2() {
System.out.println("割る数を入力してください");
this.num2 = Integer.parseInt(sc.nextLine());
}
public int divede() {
return num1 / num2;
}
}
でき上がったのは以下のクラスですが、例外が発生して処理が終了してしまいます。
package p13;
public class DivederTest {
public static void main(String[] args) {
Divider d = new Divider();
d.setNum1();
d.setNum2();
System.out.println(d.divede());
}
}
<6÷2の計算>
割られる数を入力してください 6 割る数を入力してください 2 3 |
<6÷aの計算>
割られる数を入力してください 6 割る数を入力してください a Exception in thread "main" java.lang.NumberFormatException: For input string: "a" (以下省略) |
<6÷0の計算>
割られる数を入力してください 6 割る数を入力してください 0 Exception in thread "main" java.lang.ArithmeticException: / by zero (以下省略) |
以下のように出力されるように適切に例外処理を施しなさい。ただし、クラスDividerには手を加えてはならない。
<6÷2の計算>
割られる数を入力してください 6 割る数を入力してください 2 3 |
<6÷aの計算>
割られる数を入力してください 6 割る数を入力してください a 数値以外が入力されました。 |
<6÷0の計算>
割られる数を入力してください 6 割る数を入力してください 0 割る数に0が入力されました。 |
10.オリジナル問題作成
以上。