回答編集履歴
2
booleanの代入ワンライナー
answer
CHANGED
@@ -58,4 +58,20 @@
|
|
58
58
|
}
|
59
59
|
|
60
60
|
} while (x < 0 || x > 1);
|
61
|
+
```
|
62
|
+
|
63
|
+
---
|
64
|
+
|
65
|
+
ちなみに
|
66
|
+
```java
|
67
|
+
boolean a;
|
68
|
+
if (x == 0) {
|
69
|
+
a = true;
|
70
|
+
} else {
|
71
|
+
a = false;
|
72
|
+
}
|
73
|
+
```
|
74
|
+
ここのコードは次の1行で片づけられます。
|
75
|
+
```java
|
76
|
+
boolean a = (x == 0);
|
61
77
|
```
|
1
無限ループの原因と対処
answer
CHANGED
@@ -12,4 +12,50 @@
|
|
12
12
|
}
|
13
13
|
} while (x < 0 || x > 1);
|
14
14
|
|
15
|
+
```
|
16
|
+
|
17
|
+
### 無限ループの原因(コメントを受けて)
|
18
|
+
> 試してみると、
|
19
|
+
> 「0=true/1=false:不正な入力値です」の永久ループになってしまいました・・
|
20
|
+
|
21
|
+
自分でも試してみると、aなどの不正入力をすると無限ループ発生。
|
22
|
+
無限ループしないように工夫してスタックトレースを2回出してみるも、
|
23
|
+
Integer.parseInt()のNumberFormatExceprionと違って
|
24
|
+
Scanner#nextInt()のInputMismatchExceptionは入力が何かはスタックトレースに乗らないらしい
|
25
|
+
そこで[Scanner#nextInt](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html#nextInt--)の説明を読むとこんな文言が。
|
26
|
+
> 入力の次のトークンをintとしてスキャンします。次に示す方法で、次のトークンを有効なint値に変換できない場合、このメソッドはInputMismatchExceptionをスローします。**変換に成功すると、スキャナは一致した入力の先に進みます。**
|
27
|
+
|
28
|
+
この太字部分は、裏を返せば「変換できない場合スキャナの位置は動かない」ということではないか。
|
29
|
+
|
30
|
+
となるとどういうことが起こるか。例えば"a"を入れた場合、
|
31
|
+
|
32
|
+
0. nextInt()で数値変換できないため例外発生。
|
33
|
+
0. スキャナの位置は動かないため、まだ入力には"a"が残った状態になる。
|
34
|
+
0. ループによりこの状態で再びnextInt()が呼ばれるため、また"a"を変換しようとして例外発生。
|
35
|
+
|
36
|
+
これが永遠に繰り返されるわけだ。
|
37
|
+
これを防ぐためには、例外発生時に変換できなかった文字を飛ばす必要がある。
|
38
|
+
```java
|
39
|
+
do {
|
40
|
+
try {
|
41
|
+
System.out.print("0=true/1=false:");
|
42
|
+
x = stdIn.nextInt();
|
43
|
+
} catch (InputMismatchException e) {
|
44
|
+
System.out.println("不正な入力値です");
|
45
|
+
stdIn.next(); // 変換できなかった文字列を飛ばす
|
46
|
+
}
|
47
|
+
|
48
|
+
} while (x < 0 || x > 1);
|
49
|
+
```
|
50
|
+
ただこれだと不格好なので、nextInt()を使わず文字列で読み込んでparseInt()という方法も考えられる。
|
51
|
+
```java
|
52
|
+
do {
|
53
|
+
try {
|
54
|
+
System.out.print("0=true/1=false:");
|
55
|
+
x = Integer.parseInt(stdIn.next());
|
56
|
+
} catch (NumberFormatException e) {
|
57
|
+
System.out.println("不正な入力値です");
|
58
|
+
}
|
59
|
+
|
60
|
+
} while (x < 0 || x > 1);
|
15
61
|
```
|