無限ループを引き起こす InputMismatchException を伴う try/catch ブロック
ユーザーからの整数入力を受け入れるように設計された Java プログラムでは、try/catchブロックは無効な入力を処理するために使用されます。ただし、以下のコードでは、ユーザーが非整数値、特に InputMismatchException を入力すると、無限ループが発生します。
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); } }
これが発生する理由を理解するには、InputMismatchException が発生したときの Scanner クラスの動作を調べることが重要です。 。例外をスローした後、Scanner は無効な入力を破棄しません。代わりに、入力ストリームに残り、try/catch ブロック内で無限ループが発生する可能性があります。
解決策は、catch ブロック内で input.next() を明示的に呼び出して無効なトークンを破棄することです。さらに、入力を受け入れる前に hasNextInt() を使用して、有効な整数が利用可能かどうかを確認することをお勧めします。
以下の修正されたコードは、次の推奨事項に従っています。
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 (InputMismatchException e) { System.out.println("Error!"); input.next(); // Discard the invalid token } } while (bError); System.out.printf("%d/%d = %d", n1, n2, nQuotient); } }
これらの変更を組み込むことにより、 try/catch ブロックは、InputMismatchException を効果的に処理し、ユーザーが無効な入力を入力したときにプログラムが無限ループに入らないようにします。
以上がInputMismatchException を伴う Try-Catch ブロックが Java で無限ループを引き起こすのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。