回答編集履歴

2

booleanの代入ワンライナー

2018/02/16 02:33

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -119,3 +119,35 @@
119
119
  } while (x < 0 || x > 1);
120
120
 
121
121
  ```
122
+
123
+
124
+
125
+ ---
126
+
127
+
128
+
129
+ ちなみに
130
+
131
+ ```java
132
+
133
+ boolean a;
134
+
135
+ if (x == 0) {
136
+
137
+ a = true;
138
+
139
+ } else {
140
+
141
+ a = false;
142
+
143
+ }
144
+
145
+ ```
146
+
147
+ ここのコードは次の1行で片づけられます。
148
+
149
+ ```java
150
+
151
+ boolean a = (x == 0);
152
+
153
+ ```

1

無限ループの原因と対処

2018/02/16 02:33

投稿

swordone
swordone

スコア20651

test CHANGED
@@ -27,3 +27,95 @@
27
27
 
28
28
 
29
29
  ```
30
+
31
+
32
+
33
+ ### 無限ループの原因(コメントを受けて)
34
+
35
+ > 試してみると、
36
+
37
+ > 「0=true/1=false:不正な入力値です」の永久ループになってしまいました・・
38
+
39
+
40
+
41
+ 自分でも試してみると、aなどの不正入力をすると無限ループ発生。
42
+
43
+ 無限ループしないように工夫してスタックトレースを2回出してみるも、
44
+
45
+ Integer.parseInt()のNumberFormatExceprionと違って
46
+
47
+ Scanner#nextInt()のInputMismatchExceptionは入力が何かはスタックトレースに乗らないらしい
48
+
49
+ そこで[Scanner#nextInt](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html#nextInt--)の説明を読むとこんな文言が。
50
+
51
+ > 入力の次のトークンをintとしてスキャンします。次に示す方法で、次のトークンを有効なint値に変換できない場合、このメソッドはInputMismatchExceptionをスローします。**変換に成功すると、スキャナは一致した入力の先に進みます。**
52
+
53
+
54
+
55
+ この太字部分は、裏を返せば「変換できない場合スキャナの位置は動かない」ということではないか。
56
+
57
+
58
+
59
+ となるとどういうことが起こるか。例えば"a"を入れた場合、
60
+
61
+
62
+
63
+ 0. nextInt()で数値変換できないため例外発生。
64
+
65
+ 0. スキャナの位置は動かないため、まだ入力には"a"が残った状態になる。
66
+
67
+ 0. ループによりこの状態で再びnextInt()が呼ばれるため、また"a"を変換しようとして例外発生。
68
+
69
+
70
+
71
+ これが永遠に繰り返されるわけだ。
72
+
73
+ これを防ぐためには、例外発生時に変換できなかった文字を飛ばす必要がある。
74
+
75
+ ```java
76
+
77
+ do {
78
+
79
+ try {
80
+
81
+ System.out.print("0=true/1=false:");
82
+
83
+ x = stdIn.nextInt();
84
+
85
+ } catch (InputMismatchException e) {
86
+
87
+ System.out.println("不正な入力値です");
88
+
89
+ stdIn.next(); // 変換できなかった文字列を飛ばす
90
+
91
+ }
92
+
93
+
94
+
95
+ } while (x < 0 || x > 1);
96
+
97
+ ```
98
+
99
+ ただこれだと不格好なので、nextInt()を使わず文字列で読み込んでparseInt()という方法も考えられる。
100
+
101
+ ```java
102
+
103
+ do {
104
+
105
+ try {
106
+
107
+ System.out.print("0=true/1=false:");
108
+
109
+ x = Integer.parseInt(stdIn.next());
110
+
111
+ } catch (NumberFormatException e) {
112
+
113
+ System.out.println("不正な入力値です");
114
+
115
+ }
116
+
117
+
118
+
119
+ } while (x < 0 || x > 1);
120
+
121
+ ```