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

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

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

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

Q&A

解決済

2回答

4080閲覧

Scannerを2回宣言できない

cretter

総合スコア91

Java

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

0グッド

0クリップ

投稿2020/08/29 09:36

前提・実現したいこと

javaで四則計算用のプログラムを作っている途中なので、例)「4+2=」と入力したとき「5」と返ってくるプログラムを作っています。また、足し算だけではなく引き算や掛け算なども「2*5=」などのように入力し、「10」と返ってくるようなものです。
そこで、数字を入力してから演算子の文字列を入力することを繰り返すプログラムを作ろうとしたらScannerの宣言ができなくなってしまい(できたんですけどcloseできなくなってしまった)、この直し方を検索しても出てこないので質問させていただきました。

発生している問題・エラーメッセージ

calcu01.java:16: エラー: この文に制御が移ることはありません stage1.close(); ^ エラー1個

該当のソースコード

java

1import java.util.Scanner; 2public class calcu01 3{ 4 static String answer =""; 5 public static void main(String[] args) 6 { 7 Scanner stage1 = new Scanner(System.in); 8 Scanner stage2 = new Scanner(System.in); 9 while(true){ 10 int num1 = stage1.nextInt(); 11 String let1 = stage2.next(); 12 System.out.println(num1); 13 System.out.println(let1); 14 15 } 16 stage1.close(); 17 stage2.close(); 18 19 System.out.println(answer); 20 21 } 22 23 public static void put(String str) 24 { 25 System.out.println(str); 26 } 27}

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

java jdk-14.0.2

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

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

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

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

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

m.ts10806

2020/08/29 09:48

Scannerが何者で、とか仕様はどの程度把握した上で使われているのでしょうか
dodox86

2020/08/29 10:20 編集

> calcu01.java:16: エラー: この文に制御が移ることはありません エラーメッセージ通りです。 while(true) {...} で、コード上、while文を抜けることがあり得ない為です。あと、質問内容に直接的には関係ないですが、 > 「例)「4+2=」と入力したとき「5」」と返ってくる 4+2 は6です。例とは言え、正しく記載した方が良いと思います。そうでないと、「足し算のときに特別な処理を追加するのか」などと疑問に思ってしまいます。
LouiS0616

2020/08/29 10:26 編集

どのような文言で検索してみたのか追記して下さい。回答に役立つことが多いです。 また、タイトルに『Scannerを2回宣言できない』とありますが、今回のエラーが本当にこれに起因するかどうか調査してみましょう。調査と言っても、stage2が関連している文を幾つか消してコンパイルしてみれば良いだけです。
cretter

2020/08/29 11:27

dodox86さんありがとうございます。 試しにwhileの条件をfalseにしてみたら直りました。 助言ありがとうございます。 できれば回答として同じことを書いてほしいです。 ベストアンサーにします。
dodox86

2020/08/29 14:19

>@cretterさん 回答として投稿しました。よろしくお願いします。
guest

回答2

0

ベストアンサー

質問文中で提示されている以下のコンパイルエラーメッセージですが、

calcu01.java:16: エラー: この文に制御が移ることはありません

その内容どおり、while (true) {...} においてループの脱出条件が無く、その為while文を抜けず、それ以降の制御(処理)に到達することが無いことを示しています。何らかの適切なwhile脱出条件や脱出の為の文(break)などを追加してください。

※質問件名の「Scannerを2回宣言できない」については結果的にそのようになってしまっているだけで、コンパイルエラーの内容とは直接関係ありません。

投稿2020/08/29 14:18

dodox86

総合スコア9256

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

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

0

System.in という 1つの入力に対して Scanner を 2つ用意するのは
間違ったやり方だと思います。

Scanner を 2つ使うのは、1つは標準入力、もう 1つは入力された行の文字列と
いうような場合です。

例えば、次のコードをよく読んでください。

Java

1import java.util.Scanner; 2 3class Test { 4 public static void main(String[] args) { 5 Scanner sc = new Scanner(System.in); 6 while (true) { 7 System.out.print(">> "); 8 if (!sc.hasNextLine()) break; 9 String line = sc.nextLine(); 10 Scanner sc2 = new Scanner(line); 11 try { 12 int x = sc2.nextInt(); 13 String op = sc2.next(); 14 int y = sc2.nextInt(); 15 int z = 0; 16 switch (op) { 17 case "+": z = x + y; break; 18 case "-": z = x - y; break; 19 case "*": z = x * y; break; 20 case "/": z = x / y; break; 21 } 22 System.out.println(z); 23 } 24 catch (Exception e) { 25 System.out.println(" Error"); 26 } 27 sc2.close(); 28 } 29 sc.close(); 30 } 31}

入力は数や演算子をスペースで区切って、4 + 2 = のようにしてください。

4+2= のようにスペースなしにしたい場合は少し面倒になります。

Java

1import java.util.Scanner; 2import java.util.regex.*; // Pattern, MatchResult; 3 4class Test { 5 public static void main(String[] args) { 6 Scanner sc = new Scanner(System.in); 7 Pattern pat = Pattern.compile("(\d+)\s*(.)\s*(\d+)\s*="); 8 while (true) { 9 System.out.print(">> "); 10 if (!sc.hasNextLine()) break; 11 String line = sc.nextLine(); 12 Scanner sc2 = new Scanner(line); 13 try { 14 sc2.findInLine(pat); 15 MatchResult r = sc2.match(); 16 int x = Integer.parseInt(r.group(1)); 17 int y = Integer.parseInt(r.group(3)); 18 int z = 0; 19 switch (r.group(2)) { 20 case "+": z = x + y; break; 21 case "-": z = x - y; break; 22 case "*": z = x * y; break; 23 case "/": z = x / y; break; 24 } 25 System.out.println(z); 26 } 27 catch (Exception e) { 28 System.out.println(" Error"); 29 } 30 sc2.close(); 31 } 32 sc.close(); 33 } 34}

投稿2020/08/29 11:57

編集2020/08/29 22:13
kazuma-s

総合スコア8224

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問