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

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

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

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

Q&A

解決済

2回答

2748閲覧

標準入力をスキャンしたときの「hasNext()」の挙動に関しまして

a2606

総合スコア22

Java

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

0グッド

0クリップ

投稿2018/06/25 14:50

前提・実現したいこと

標準入力を引数にしたScannerクラスについて、
下記のように、while文の条件式に「hasNext()」を使用したところ、
入力を待ち続け、ループから抜けることができませんでした。

このとき開発環境は、「Eclipse」を使用していたのですが、
「paiza.io」「AIZU ONLINE JUDGE」といった、
予め標準入力を設定し、実行する場合にはループが発生せず、実行することができました。

この現象は、「Eclipse」のコンソールのように、
エンターキーを入力したあとも、引き続き文字の入力が行える環境で、
発生する仕様という認識で正しいのでしょうか?

恐れ入りますが、ご教示頂けますと幸いです。

該当のソースコード

java

1import java.util.Scanner; 2 3public class Main { 4 static int[] s = new int[200]; // オペランド100個と演算子99個が収まる容量 5 static int top = 0; 6 static int max = 200; 7 8 public static void main(String[] args) { 9 Scanner sc = new Scanner(System.in); 10 11 while (sc.hasNext()) { 12 if (sc.hasNextInt()) { 13 int num = sc.nextInt(); 14 push(num); 15 16 } else { 17 String str = sc.next(); 18 int a = pop(); 19 int b = pop(); 20 21 switch (str) { 22 case "+": 23 push(b + a); 24 break; 25 26 case "-": 27 push(b - a); // LIFO(後入れ先出し) 28 29 break; 30 case "*": 31 push(b * a); 32 break; 33 } 34 } 35 } 36 System.out.println(pop()); 37 38 } 39 40 /* 配列によるスタックの実装 */ 41 42 private static void initialize() { 43 top = 0; 44 } 45 46 private static boolean isEmpty() { 47 return top == 0; 48 } 49 50 private static boolean isFull() { 51 return top >= max - 1; 52 } 53 54 private static void push(int x) { 55 if (!isFull()) { 56 top++; 57 s[top] = x; 58 } else { 59 System.err.println("容量オーバーです。"); 60 } 61 } 62 63 private static int pop() { 64 int ret = -1; 65 if (!isEmpty()) { 66 ret = s[top]; 67 top--; 68 } else { 69 System.err.println("中身が空です。"); 70 } 71 return ret; 72 } 73 74}

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

OS : macOS High Sierra (10.13.5)
IDE : Eclipse Oxygen.1a Release (4.7.1a)
JRE : 1.8.0_144

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/06/25 15:06 編集

・q・)はやとtり
LouiS0616

2018/06/25 14:57 編集

試した結果質問に至っているのでは。
guest

回答2

0

ベストアンサー

この現象は、「Eclipse」のコンソールのように、

エンターキーを入力したあとも、引き続き文字の入力が行える環境で、
発生する仕様という認識で正しいのでしょうか?

Scanner#hasNext()は、入力ストリームがEOFに達したときにfalseを返すようです。
明示的にEOFを送出してやれば、コンソールでもループから脱出可能です。

投稿2018/06/25 14:56

LouiS0616

総合スコア35660

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

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

a2606

2018/06/25 15:31

ご回答ありがとうございます。 コンソール上で「control + d」(Mac版)を行うことで、ループから抜けることができました。 また、この際「Eclipse」では、一回でEOFは認識されなかったのですが、 一度コンソール以外にフォーカスを移してから、再度コンソールへ戻りEOFを入力することで、認識されるようになりました。 【参考URL】 https://qiita.com/tk3fftk/items/cec70f6314e5a08fff42
guest

0

paiza.io とかみたいなのでよくやることなんだけど
こういう処理で疑似的にEOFを発生させてる方法もありますがコンソールだとEOFはきついかもね

public class Main { public static void main(String[] args) throws Exception { System.setIn(new FileInputStream("file")); // System.in を FileInputStream に変更 Exec.main(args); } }
public class Exec { public static void main(String[] args) { // テスト実行用 main } }

投稿2018/06/25 15:14

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問