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

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

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

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

Q&A

解決済

1回答

1218閲覧

scanner 入力について疑問点があります。

talabagani

総合スコア50

Java

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

0グッド

1クリップ

投稿2021/06/28 21:13

#[環境]
Java version 16.0.1
VS Code
Mac OS Big Surの環境です。
java -version
java version "16.0.1" 2021-04-20
Java(TM) SE Runtime Environment (build 16.0.1+9-24)
Java HotSpot(TM) 64-Bit Server VM (build 16.0.1+9-24, mixed mode, sharing)
MacBook:09_MinutesToYearsandDayCalculator $

#[エラー]
エラーではなく疑問点があります。

[学習状況]
progateを3巡、ドットインストール1巡、スッキリJavaの本を8割読みました。現在、UdemyのJava Programming Masterclass for Software Developersというコースで演習問題に取り組んでいます
まだまだ初心者ですが真面目に取り組んでいるので、何卒、よろしくお願いします。

#[わからない事]
scannerの学習をしていて不思議に思うことがありました。
一番初めのコードでは、 yearOfBirthをインプットする仕様になっていてそのあと、nameをインプットするようになっています。しかしながらこのままだと、yearOfBirthを入力したと、nameをインプットする時間もなく、最後まで実行されてしまいます。
そこで
scanner.nextLine();
を入れるようにという話がありました。

しかしながら、二つ目のコードではなんの指示もしなくてもいちいちちゃんと入力を待ってくれます。
この違いはどこからくるものなのでしょうか?

#[コード]

java

1import java.util.Scanner; 2public class Main { 3 public static void main(String[] args) { 4 Scanner scanner = new Scanner(System.in); 5 System.out.println("Enter your year of birth; "); 6 int yearOfBirth = scanner.nextInt(); 7 //scanner.nextLine(); //handle the next line charactor 8 System.out.println("Enter your name; "); 9 String name= scanner.nextLine(); 10 int age = 2021-yearOfBirth; 11 12 System.out.println("Your name is " + name + "and you are " + age + "year old"); 13 scanner.close(); 14 } 15 16}

java

1import java.util.Scanner; 2public class solution2 { 3 public static void main(String[] args) { 4 Scanner in = new Scanner(System.in); 5 System.out.print("Input first number: "); 6 int num1 = in.nextInt(); 7 System.out.print("Input second number: "); 8 int num2 = in.nextInt(); 9 System.out.print("Input third number: "); 10 int num3 = in.nextInt(); 11 System.out.print("Input fourth number: "); 12 int num4 = in.nextInt(); 13 14 if (num1 == num2 && num2 == num3 && num3 == num4) 15 { 16 System.out.println("Numbers are equal."); 17 } 18 else 19 { 20 System.out.println("Numbers are not equal!"); 21 } 22 } 23}

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

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

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

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

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

y_waiwai

2021/06/28 21:16

> しかしながらこのままだと、yearOfBirthを入力したと、nameをインプットする時間もなく、最後まで実行されてしまいます。 ってことはありえないので、原文を提示してみてください
m.ts10806

2021/06/28 21:33 編集

質問は変に自分で構成するより質問テンプレート使った方がいいです。 「エラー」と言う内容なのに何も内容がないです。ただの挨拶です。
guest

回答1

0

ベストアンサー

nameをインプットする時間もなく、最後まで実行されてしまいます。

nameはインプットされています。

int yearOfBirth = scanner.nextInt();

の入力時に

2000 AAA と入力してみてください。

nameには、 AAA(AAAの前にスペースあり)が入力されているはずです。

int num1 = in.nextInt();

の入力時に

1 2 3 4と入力してみてください。
num2~num4に、入力を待たずに値が設定されます。

要は、1行で入力をしているようですが、Scannerは入力をバッファリングしていて
nextIntなどで対応する値をバッファから取ってきています。

int yearOfBirth = scanner.nextInt();

で入力したのは数値だけでなく改行も入力されています。
nextIntは数値部分のみをうけつけるので、バッファには改行が残っています。

nextLineでは改行までが取得されます。
結果、””(空文字)を取得してnameに代入します。

投稿2021/06/29 00:45

momon-ga

総合スコア4820

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

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

talabagani

2021/06/29 22:31

nextInt()では数字のみ受け付けてその後の改行を文字として受け取って溜めておいてしまうということ、理解しました。 class Main の方でscanner.nextLine(); こちらは String kaigyo=scanner.nextLine(); みたいに定義しなくてもいいのでしょか?String kaigyo=scanner.nextLine(); でも問題なく動きました。 いつも定義しているのでちょっと違和感がありました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問