[解決済み] InputMismatchExceptionでtry/catchすると、無限ループになる。
2022-02-01 10:23:31
質問
そこで、ユーザー入力からintを受け取るプログラムを作っています。非常に単純なtry/catchブロックがあり、ユーザーがintを入力しない場合、入力されるまでこのブロックを繰り返す必要があります。以下は、そのコードの関連部分です。
import java.util.InputMismatchException;
import java.util.Scanner;
public class Except {
public static void main(String[] args) {
Scanner input = new Scanner(System.in);
boolean bError = true;
int n1 = 0, n2 = 0, nQuotient = 0;
do {
try {
System.out.println("Enter first num: ");
n1 = input.nextInt();
System.out.println("Enter second num: ");
n2 = input.nextInt();
nQuotient = n1/n2;
bError = false;
}
catch (Exception e) {
System.out.println("Error!");
}
} while (bError);
System.out.printf("%d/%d = %d",n1,n2, nQuotient);
}
}
2つ目の整数に0を入力すると、try/catchがその通りに実行され、もう一度入力させられます。しかし、5.5を入力してInputMismatchExceptionが発生した場合、エラーメッセージが表示され、無限ループに陥ります。なぜ、このようなことが起こるのでしょうか?また、どうすればよいのでしょうか?(ちなみに、catchの引数にInputMismatchExceptionを明示的に入力してみましたが、問題は解決されませんでした。
どうすればいいですか?
を呼び出す必要があります。
next();
というエラーが発生します。また
hasNextInt()
catch (Exception e) {
System.out.println("Error!");
input.next();// Move to next other wise exception
}
整数値を読み取る前に、スキャナが整数値を持っていることを確認する必要があります。そして、このような例外処理は必要ありません。
Scanner scanner = new Scanner(System.in);
int n1 = 0, n2 = 0;
boolean bError = true;
while (bError) {
if (scanner.hasNextInt())
n1 = scanner.nextInt();
else {
scanner.next();
continue;
}
if (scanner.hasNextInt())
n2 = scanner.nextInt();
else {
scanner.next();
continue;
}
bError = false;
}
System.out.println(n1);
System.out.println(n2);
のJavadoc スキャナ
<ブロッククオートスキャナがInputMismatchExceptionをスローした場合、スキャナは例外の原因となったトークンを渡さないので、他のメソッドで取得したりスキップしたりすることができるようになります。
関連
-
[解決済み】エラー「No enclosing instance of type Foo is accessible」の原因と修正方法について教えてください。
-
[解決済み】「'void' type not allowed here」エラーの原因とは?
-
[解決済み】不正な反射的アクセスとは?
-
[解決済み] hibernate のプロパティが見つかりません。
-
[解決済み】「error: '.class' expected」の意味と修正方法について
-
[解決済み】Javaの部分文字列:「文字列のインデックスが範囲外」。
-
[解決済み】java 'jar'が内部コマンドまたは外部コマンドとして認識されない。
-
[解決済み】破損したjarファイル
-
[解決済み] なぜすべてのブロックを "try"-"catch "で包んではいけないのですか?
-
[解決済み】try catchでのThrowableとExceptionの使い分けについて
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み】HTTPステータス500 サーブレットクラスのインスタンス化エラー [重複]。
-
[解決済み] 解決済み】Javaが「型をインスタンス化できない」というエラーを返す [重複] [重複]
-
[解決済み】Eclipseがエラーメッセージ "Java was started but returned exit code = 1" を返す
-
[解決済み】Javaで無限大を実装する方法とは?
-
[解決済み】keytoolエラー 鍵屋が改ざんされたか、パスワードが不正確だった場合
-
[解決済み】java 'jar'が内部コマンドまたは外部コマンドとして認識されない。
-
[解決済み] intellijが自動配線リポジトリにタイプのBeanが見つからないと不正確な発言をする件
-
[解決済み】koch snowflake java recursion
-
[解決済み] SQLエラー。0, SQLState: 08S01 通信リンクの失敗 [重複]。