teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

2

booleanの代入ワンライナー

2018/02/16 02:33

投稿

swordone
swordone

スコア20675

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

無限ループの原因と対処

2018/02/16 02:33

投稿

swordone
swordone

スコア20675

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
  ```