質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

1782閲覧

if (!「変数」.hasNextLine()) break;の使い方を知りたい

cretter

総合スコア91

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/08/31 12:37

編集2020/08/31 14:05

前提・実現したいこと

5行目から7行目までの意味の解説をお願いします。
特に「if (!sc.hasNextLine()) break;」の意味と使い方を詳しく教えてくれるとありがたいです。

該当のソースコード

java

1import java.util.Scanner; 2public class calcu01 3{ 4 public static void main(String[] args) 5 { 6 Scanner sc = new Scanner(System.in); 7 while(true){ 8 System.out.print(">> "); 9 if (!sc.hasNextLine()) break; 10 String line = sc.nextLine(); 11 Scanner sc2 = new Scanner(line); 12 try{ 13 double x = sc2.nextDouble(); 14 String op = sc2.next(); 15 double y = sc2.nextDouble(); 16 double z = 0; 17 switch(op){ 18 case "q": z = x + y; break; 19 case "w": z = x - y; break; 20 case "e": z = x * y; break; 21 case "r": z = x / y; break; 22 case "z": 23 put("終了します"); 24 System.exit(0); 25 break; 26 } 27 System.out.println(z); 28 } 29 catch(Exception e){ 30 System.out.println(" Error"); 31 } 32 sc2.close(); 33 } 34 sc.close(); 35 } 36 public static void put(String str) 37 { 38 System.out.println(str); 39 } 40}

補足情報(FW/ツールのバージョンなど)

java jdk-14.0.2

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Scanner#hasNextLineメソッド はこの後の入力に続きがあればTrue,もうこれ以上入力がなければFalseを返します。

if (!sc.hasNextLine()) break;は、hasNextLine()の結果がfalseの場合、最も内側のループを抜けて外へ脱出します(今回の場合は7行目からのwhileを抜け34行目へ飛びます)。

すなわち、if (!sc.hasNextLine()) break;の役割は入力がこれ以上なくなったタイミングで無限ループを脱出し、プログラムを終了させるためのものです。

入力が標準入力の場合、「これ以上入力があるかどうか」の判定は入力した文字が全部処理されたかどうかではなく「標準入力を閉じたかどうか」となります。
windowsのコマンドプロンプトだとCtrl+Z、LinuxだとCtrl+Dが入力されたときに「もうこれ以上入力はない」と判定されます。
ただの改行のみの入力ではhasNextLine()がFalseにならないので注意です。

投稿2020/08/31 14:31

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

if (!「変数」.hasNextLine()) break;の使い方

なんてものはありません。コードは細かいパーツの組み合わせですので、一つ一つの動きを調べ、
それを組み合わせた時にどのような動きをするのか、自分で考える必要があります。

「変数」.hasNextLine()
まずは、ここが問題です。これでは、何が起きるのか誰にもわかりません。
JAVAには、変数に.hasNextLine()を付けたら、どうなる、というような言語的なルールは存在しません。

オリジナルの方を見てみると、
sc.hasNextLine()
とあります。そこからさらに scが何者なのかを辿ると、
Scanner sc = new Scanner(System.in);
とあるので、scScannerクラスと分かります。

その次には、Scannerクラスのリファレンスを確認します。
hasNextLine()メソッドの欄を見ると、こうあります。

public boolean hasNextLine()

このスキャナの入力に別の行がある場合はtrueを返します。

戻り値はbooleanで、内容は次の行があるかどうか、です。

ここまで行くと、sc.hasNextLine()の意味が解りますが、
scの対象はSystem.in標準入力なのですこし厄介です。
標準入力はユーザーが入力し続ける限り、次の行が存在する一種の無限のストリームになっていますので、
次の行はずっとあり続けます(常にtrue)。

これを終了させるには、WindowsであればCTRL-Z、UNIXやLinuxであればCTRL-Dを入力することで、
終了とみなされ、結果がfalseになります。

sc.hasNextLine() =「入力が続いているか」みたいな感じになります。

次はこの部分です。
!sc.hasNextLine()
これはシンプルに、!+sc.hasNextLine() です。
!は、論理演算を行う単項演算子で、真は偽に、偽は真にと、真偽値を反転します。
意味に置き換えれば、上のものを反転するので、

!sc.hasNextLine() =「入力が終了したか」になります。

if (!sc.hasNextLine()) break;
あとは、普通にif文ですので、
「入力が終了したなら、break」
となります。

これにより、すぐ外側の、while(true)の無限ループを抜けます。
そこまで含めるなら、「入力が終了するまで繰り返せ」になります。

投稿2020/08/31 13:53

編集2020/08/31 15:17
amiya

総合スコア1218

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cretter

2020/08/31 14:03 編集

回答ありがとうございます。 確かによく見るとScanner sc = new Scanner(System.in);が消えてました。 これらを含めて編集をしてみたのでお願いしいます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問