アプリ版:「スタンプのみでお礼する」機能のリリースについて

以下のクラスQ1のように,0<a<6である整数の入力をScannerで求めたとき,aという文字を入力してInputMismatchExceptionを発生させたところ,再度入力を迫られずに無限ループと化してしまいました.
再度入力を迫るように適切に書き換えるにはどうすればいいのでしょうか.

自分は,while()での処理が悪さをしているような気がするのですが...

*************************************
import java.util.Scanner;

public class Q1 {

public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int a = 0;
do {
try {
System.out.print("Input an integer less than 6 and greater than 0:");
a = sc.nextInt();
} catch (InputMismatchException e) {
e.printStackTrace();
}
} while (a <= 0 || a >= 6);
System.out.println(a);
}
}
***************************************

A 回答 (2件)

'a'という入力が捨てられないので、ループして(Scannerの)nextIntメソッドで再び例外が発生することを繰り返します。



InputMismatchExceptionが発生したとき、(Scannerの)nextメソッドで入力を捨てるようにすると良いと思います。

この回答への補足

ご回答ありがとうございます.
>'a'という入力が捨てられないので、ループして(Scannerの)nextIntメソッドで再び例外が発生することを繰り返します。
確かにそうですね.どうやってこの`a'を消そうかわかりませんでした.

>InputMismatchExceptionが発生したとき、(Scannerの)nextメソッドで入力を捨てるようにすると良いと思います。
これはどういうことでしょうか.
e.printStackTrace();
の後にa=sc.nextInt()を加えるのでしょうか?
これでは例外発生後に終了してしまいました.
a=next();ではint aに矛盾してしまいますし.

補足日時:2009/09/08 13:12
    • good
    • 0

> e.printStackTrace();


> の後にa=sc.nextInt()を加えるのでしょうか?
> これでは例外発生後に終了してしまいました.
> a=next();ではint aに矛盾してしまいますし.

InputMismatchExceptionのcatchブロックに、

sc.next();

を加えると良いと思います。

#e.printStackTrace();
#の前でも後でも構いません。

InputMismatchExceptionのcatchブロックが実行されるとき、
aに値は代入されず繰り返し条件は真となるので、
この場合、特にaに何か代入する必要はありません。
    • good
    • 0
この回答へのお礼

うまくいきました.
本当にありがとうございました.

お礼日時:2009/09/08 18:41

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!