回答編集履歴

1

修正

2020/08/31 15:17

投稿

amiya
amiya

スコア1218

test CHANGED
@@ -20,14 +20,76 @@
20
20
 
21
21
  `sc.hasNextLine()`
22
22
 
23
- とあります。が、肝心の`sc`が何者なのか、ソースコードには一切情報がありません。
23
+ とあります。そこからさらに `sc`が何者なのかを辿ると
24
24
 
25
+ `Scanner sc = new Scanner(System.in);`
26
+
25
- それが判らないこには、`.hasNextLine()`が何も不明のまです。
27
+ あるので、`sc`は`Scanner`クラスと分ます。
26
28
 
27
29
 
28
30
 
31
+ その次には、`Scanner`クラスの[リファレンス](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html)を確認します。
32
+
29
- (想像自体は付きますがそれはで想像でので)
33
+ `hasNextLine()`メソッドの欄を見るとこうます
30
34
 
31
35
 
32
36
 
37
+ > public boolean hasNextLine()
38
+
39
+ このスキャナの入力に別の行がある場合はtrueを返します。
40
+
41
+
42
+
43
+ 戻り値はbooleanで、内容は次の行があるかどうか、です。
44
+
45
+
46
+
47
+ ここまで行くと、`sc.hasNextLine()`の意味が解りますが、
48
+
49
+ `sc`の対象は`System.in`標準入力なのですこし厄介です。
50
+
51
+ 標準入力はユーザーが入力し続ける限り、次の行が存在する一種の無限のストリームになっていますので、
52
+
53
+ 次の行はずっとあり続けます(常に`true`)。
54
+
55
+
56
+
57
+ これを終了させるには、Windowsであれば`CTRL-Z`、UNIXやLinuxであれば`CTRL-D`を入力することで、
58
+
59
+ 終了とみなされ、結果が`false`になります。
60
+
61
+
62
+
63
+ `sc.hasNextLine()` =「入力が続いているか」みたいな感じになります。
64
+
65
+
66
+
67
+ 次はこの部分です。
68
+
69
+ `!sc.hasNextLine()`
70
+
71
+ これはシンプルに、`!`+`sc.hasNextLine()` です。
72
+
73
+ `!`は、論理演算を行う単項演算子で、真は偽に、偽は真にと、真偽値を反転します。
74
+
75
+ 意味に置き換えれば、上のものを反転するので、
76
+
77
+
78
+
79
+ `!sc.hasNextLine()` =「入力が**終了した**か」になります。
80
+
81
+
82
+
83
+ `if (!sc.hasNextLine()) break;`
84
+
85
+ あとは、普通にif文ですので、
86
+
87
+ 「入力が**終了した**なら、break」
88
+
89
+ となります。
90
+
91
+
92
+
93
+ これにより、すぐ外側の、`while(true)`の無限ループを抜けます。
94
+
33
- ずはコードから、`sc`の正体を確定する必要があります。
95
+ そこで含めるなら、「入力が終了するまで繰返せ」になります。