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 중국어 웹사이트의 기타 관련 기사를 참조하세요!