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

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

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

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

Q&A

解決済

4回答

12923閲覧

try-catchの処理で何故か無限ループになる

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

ループ

ループとは、プログラミングにおいて、条件に合致している間、複数回繰り返し実行される箇所や、その制御構造を指します

0グッド

2クリップ

投稿2018/03/16 09:32

じゃんけんをするプログラムのゲーム回数を入力してもらう部分です。

数字以外の「aaa」と入力すると、
ゲーム回数を入力してください:エラーです。

ゲーム回数を入力してください:エラーです。

ゲーム回数を入力してください:エラーです。

と無限ループします。

catch処理のあとループでまたtryの中に入ると思っていましたがうまくいきません。

自然数を入力するまで何度も入力させるようにしたいのですがどうしたらいいでしょうか。

lang

1 2public void play() { 3 4 int rounds; 5 6 Scanner scan = new Scanner( System.in); 7 while ( true) { 8 System.out.print( "ゲーム回数を入力してください:"); 9 try { 10 rounds = scan.nextInt(); 11 while ( rounds<0) { 12 System.out.println( "エラーです。\n"); 13 System.out.print( "ゲーム回数を入力してください:"); 14 rounds = scan.nextInt(); 15 } 16 break; 17 } 18 catch ( Exception e) { 19 System.out.println( "エラーです。\n"); 20 } 21 }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2018/03/16 10:39

無限ループはとまりませんよ。どう見ても有限です。
guest

回答4

0

ベストアンサー

nextInt()は整数と見做せる部分を読み込んでくれるメソッドですが、"aaa"などとすると最初の文字'a'からしてもはや数字('0'~'9')でも符号でもないので一文字も入力が消費されないうちに例外が発生します。その状態でいくらnextInt()を繰り返しても例外しかおきないのです。

nextIntを使うのを止めましょう。

next()を呼び、その結果をInteger#parseIntで整数値へ変換するように直して試してみたらよいと思います。

nextIntは入力ミスを想定しなくてよい場合か、例外がおきたら処理を中断してよい場合に使いましょう。

投稿2018/03/16 09:50

KSwordOfHaste

総合スコア18394

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

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

退会済みユーザー

退会済みユーザー

2018/03/16 10:08

理解しました、ありがとうございます!
退会済みユーザー

退会済みユーザー

2018/03/16 10:42

hasNextIntでチェックできるよ。(笑) ※ クラス設計上の推奨策(例外コストガガガ)
KSwordOfHaste

2018/03/16 11:24 編集

そーなんですが、本要件では整数が読めるまで入力を継続しなければならないので、hasNextIntがfalseになったときにnext()でskipしなければならず、最初からnext()を用いてparseInt()した方が素直かなぁと感じたのです。
guest

0

おそらく、

rounds = scan.nextInt();

この関数の中でコンソールの入力、数値変換等をやってると思いますが、ここの処理が例外の発動で中途半端な状態になってるんじゃないでしょうか。
この関数のナカミがわかりませんが、そこらへんチェックしてみましょう


ああ、ScannerってJavaの標準関数(クラス?)だったのねw

投稿2018/03/16 09:38

編集2018/03/16 09:51
y_waiwai

総合スコア87747

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

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

KSwordOfHaste

2018/03/16 09:53 編集

失礼しました。かぶりました。 --- って、自作メソッドと思われてたんですね...いずれにせよ結論は同様のところへいくつくはずですね。
y_waiwai

2018/03/16 09:53

いやー、不勉強なもので。。
退会済みユーザー

退会済みユーザー

2018/03/16 10:45

いやー、大規模アップデート内の些事(java tiger)での実装クラスですから把握してない人が多い気もする。
guest

0

java

1import java.util.Scanner; 2 3public class readInteger { 4 5 public static void main(String[] args) { 6 // play(); 7 // playA(); 8 // playB(); 9 playC(); 10 } 11 12 public static void play() { 13 int rounds; 14 Scanner scan = new Scanner(System.in); 15 while (true) { 16 System.out.print("ゲーム回数を入力してください:"); 17 try { 18 rounds = scan.nextInt(); 19 while (rounds < 0) { 20 System.out.println("エラーです。\n"); 21 System.out.print("ゲーム回数を入力してください:"); 22 rounds = scan.nextInt(); 23 } 24 break; 25 } catch (Exception e) { 26 System.out.println("エラーです。\n"); 27 } 28 } 29 System.out.println("回数:" + rounds); 30 } 31 32 public static void playA() { 33 // "a b" と入力すると 2 回 エラーメッセージが出る 34 int rounds; 35 Scanner scan = new Scanner(System.in); 36 while (true) { 37 try { 38 System.out.print("ゲーム回数を入力してください:"); 39 rounds = scan.nextInt(); 40 break; 41 } catch (Exception e) { 42 System.out.println("エラーです。\n"); 43 // 入力バッファのクリア 44 scan.next(); 45 } 46 } 47 System.out.println("回数:" + rounds); 48 } 49 50 public static void playB() { 51 // " 1" と入力すると、エラーメッセージが出る 52 int rounds; 53 Scanner scan = new Scanner(System.in); 54 while (true) { 55 try { 56 System.out.print("ゲーム回数を入力してください:"); 57 rounds = Integer.parseInt(scan.nextLine()); 58 break; 59 } catch (Exception e) { 60 System.out.println("エラーです。\n"); 61 } 62 } 63 System.out.println("回数:" + rounds); 64 } 65 66 public static void playC() { 67 // " 1" と入力すると、1 と認識する 68 int rounds; 69 Scanner scan = new Scanner(System.in); 70 while (true) { 71 try { 72 System.out.print("ゲーム回数を入力してください:"); 73 rounds = Integer.parseInt(scan.nextLine().trim()); 74 break; 75 } catch (Exception e) { 76 System.out.println("エラーです。\n"); 77 } 78 } 79 System.out.println("回数:" + rounds); 80 } 81}

play() は質問文にあるコードです。
"a" と入力すると、エラーメッセージ表示が無限ループしてしまいます。

playA() は、無限ループしないように scan.next() 呼び出しを追加しました。また while を1 つに減らしました。
"a b" と入力すると、 2 回 エラーメッセージが表示されます

playB() は "a b" と入力しても、1回だけのエラーメッセージとなるようにしたものです。(行単位で入力を処理するようにしました)
" 3" と入力すると、エラーメッセージが表示されます。

playC() は、 " 3" を 3 と認識するようにしたものです。 (先頭の空白を取り除くようにしました)

参考情報

  • 例外処理でリトライが無限ループする

https://ameblo.jp/slont-code/entry-11886344684.html

投稿2018/03/16 22:39

katoy

総合スコア22324

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

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

退会済みユーザー

退会済みユーザー

2018/03/16 23:38

数字以外を3文字入力したから3回ループしてる「有限」のループにみせかけるとは質問者は(w・
guest

0

一番外側のwhile(true)を外せばいいと思います

投稿2018/03/16 09:38

enoatu

総合スコア18

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

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

enoatu

2018/03/16 09:40

すいません、読み間違えていました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問