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

回答編集履歴

1

修正

2020/08/31 15:17

投稿

amiya
amiya

スコア1218

answer CHANGED
@@ -9,9 +9,40 @@
9
9
 
10
10
  オリジナルの方を見てみると、
11
11
  `sc.hasNextLine()`
12
- とあります。が、肝心の`sc`が何者なのか、ソースコードには一切情報がありません。
12
+ とあります。そこからさらに `sc`が何者なのかを辿ると
13
+ `Scanner sc = new Scanner(System.in);`
13
- それが判らないこには、`.hasNextLine()`が何も不明のまです。
14
+ あるので、`sc`は`Scanner`クラスと分ます。
14
15
 
16
+ その次には、`Scanner`クラスの[リファレンス](https://docs.oracle.com/javase/jp/8/docs/api/java/util/Scanner.html)を確認します。
15
- (想像自体は付きますがそれはで想像でので)
17
+ `hasNextLine()`メソッドの欄を見るとこうます
16
18
 
19
+ > public boolean hasNextLine()
20
+ このスキャナの入力に別の行がある場合はtrueを返します。
21
+
22
+ 戻り値はbooleanで、内容は次の行があるかどうか、です。
23
+
24
+ ここまで行くと、`sc.hasNextLine()`の意味が解りますが、
25
+ `sc`の対象は`System.in`標準入力なのですこし厄介です。
26
+ 標準入力はユーザーが入力し続ける限り、次の行が存在する一種の無限のストリームになっていますので、
27
+ 次の行はずっとあり続けます(常に`true`)。
28
+
29
+ これを終了させるには、Windowsであれば`CTRL-Z`、UNIXやLinuxであれば`CTRL-D`を入力することで、
30
+ 終了とみなされ、結果が`false`になります。
31
+
32
+ `sc.hasNextLine()` =「入力が続いているか」みたいな感じになります。
33
+
34
+ 次はこの部分です。
35
+ `!sc.hasNextLine()`
36
+ これはシンプルに、`!`+`sc.hasNextLine()` です。
37
+ `!`は、論理演算を行う単項演算子で、真は偽に、偽は真にと、真偽値を反転します。
38
+ 意味に置き換えれば、上のものを反転するので、
39
+
40
+ `!sc.hasNextLine()` =「入力が**終了した**か」になります。
41
+
42
+ `if (!sc.hasNextLine()) break;`
43
+ あとは、普通にif文ですので、
44
+ 「入力が**終了した**なら、break」
45
+ となります。
46
+
47
+ これにより、すぐ外側の、`while(true)`の無限ループを抜けます。
17
- ずはコードから、`sc`の正体を確定する必要があります。
48
+ そこで含めるなら、「入力が終了するまで繰返せ」になります。