[英]Question about exception (try-catch) within a loop
我在其他项目上也遇到过几次这个问题。 现在我试图理解异常处理,但我仍然不知道它是如何工作的。 我尝试用循环编写计算器,当我尝试输入字符串时,会有 InputMismatchException - 我试图捕捉它,但由于某种原因在 catch 子句之后,java 给了我另一个 InputMismatchException,为什么?
import java.util.InputMismatchException;
import java.util.Scanner;
public class Calculator {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int loop = 1;
while (loop == 1) {
try {
System.out.println("First number:");
int num1 = scanner.nextInt();
System.out.println("Second number:");
int num2 = scanner.nextInt();
System.out.println("Choose operator (1 for +)(2 for -)(3 for *)(4 for /): ");
int userInput = scanner.nextInt();
switch (userInput) {
case 1:
System.out.println("Result: " + num1 + " + " + num2 + " = " + (num1 + num2));
break;
case 2:
System.out.println("Result: " + num1 + " - " + num2 + " = " + (num1 - num2));
break;
case 3:
System.out.println("Result: " + num1 + " * " + num2 + " = " + (num1 * num2));
break;
case 4:
System.out.println("Result: " + num1 + " / " + num2 + " = " + (num1 / num2));
break;
default:
System.out.println("Invalid Input!");
}
System.out.println("Repeat? (1 = yes)(0 = nein)");
loop = scanner.nextInt();
} catch (InputMismatchException e) {
System.out.println("Invalid Input, try again!");
scanner.nextInt();
}
}
scanner.close();
System.out.println("Ciao!");
}
}
起初有一个无限循环,我通过scanner.nextInt();
在 catch 块中,但我仍然收到此错误:
Choose operator (1 for +)(2 for -)(3 for *)(4 for /):
er
Invalid Input, try again!
Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Unknown Source)
at java.util.Scanner.next(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at java.util.Scanner.nextInt(Unknown Source)
at Calculator.main(Calculator.java:47)
为什么?
可能是因为您没有获取 nextInt,因为下一个值不是int
。 因此,您尝试在 catch 块中再次获取相同的输入,从而再次出现 InputMismatchException。
您的 Stacktrace 还指向您尝试检索下一个int
的 catch 子句!
我建议您将 catch 子句中的nextInt
替换为nextLine
:
...
catch (InputMismatchException e) {
System.out.println("Invalid Input, try again!");
scanner.nextLine();
}
然后你将再次开始你的循环并尝试重新阅读。
还可以查看 stackoverflow 上的类似线程或 使用Scanner
class 的教程点示例。
在您的第一种情况下,它进入无限循环,因为 Scanner.nextInt scanner.nextInt();
抛出InputMismatchException
; 并且您已经处理了该异常,因此它将再次 go 进行下一次迭代,最终调用scanner.nextInt scanner.nextInt();
再次但在这种情况下,扫描仪不会移动到新行,因此它将获得 String 而不是它所期望的 int 并抛出InputMismatchException
。 您可以通过以下方式解决它:
catch (InputMismatchException e) {
System.out.println("Invalid Input, try again!");
scanner.nextLine(); // change nextInt to nextLine
}
在您当前的代码中,当 InputMismatchException 抛出时,它会转到 catch 块和您的 catch 块,然后再次执行scanner.nextInt();
抛出异常并且您的循环线程终止。
scanner.nextLine()
并且扫描仪将扫描错误的输入,以便您的循环再次开始。Integer num1 = null;
do {
try {
num1 = scanner.nextInt();
} catch (InputMismatchException e) {
System.out.println("Invalid Input, try again!");
scanner.nextLine();
}
} while (num1 == null);
如果我们想捕获异常而不是将其抛出方法之外,那么可能抛出异常的行应该在 try 块中
try{
//code which can throw exception T
}
catch( exceptions T){
// what if exception handle it
}
但在你的情况下,scanner.nextInt(); 正在尝试块中产生异常,并且控制再次在此处捕获块,您执行同一行scanner.nextLine(); 再次抛出异常,这次没有处理 removescanner.nextInt(); 来自 catch 块的行
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.