所以我正在构建一个从用户输入中获取内容的程序。我有一个看起来非常简单的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);
}
}
如果我为第二个整数输入0,那么try / catch会完全按照预期进行操作,并让我再次输入它。但是,如果我有一个InputMismatchException,比如为其中一个数字输入5.5,它只是在无限循环中显示我的错误信息。为什么会发生这种情况,我该怎么办呢? (顺便说一句,我已经尝试显式输入InputMismatchException作为catch的参数,但它没有解决问题。
答案 0 :(得分:28)
收到错误后,您需要致电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时,扫描程序将不会传递导致异常的标记,因此可以通过其他方法检索或跳过它。
答案 1 :(得分:4)
你也可以试试以下
do {
try {
System.out.println("Enter first num: ");
n1 = Integer.parseInt(input.next());
System.out.println("Enter second num: ");
n2 = Integer.parseInt(input.next());
nQuotient = n1/n2;
bError = false;
}
catch (Exception e) {
System.out.println("Error!");
input.reset();
}
} while (bError);
答案 2 :(得分:2)
另一种选择是定义Scanner input = new Scanner(System.in);在try块中,每次需要重新输入值时,这将创建一个新对象。
答案 3 :(得分:2)
要关注debobroto das的答案,你也可以把它放在
之后input.reset();
input.next();
我有同样的问题,当我尝试这个时。它完全修复了它。
答案 4 :(得分:1)
由于bError = false
中try block
语句从未到达,并且语句已触及输入,因此会继续打印无限循环中的错误。
尝试使用hasNextInt()
catch (Exception e) {
System.out.println("Error!");
input.hasNextInt();
}
或者尝试使用nextLine()
加上Integer.parseInt()
来获取输入....
Scanner scan = new Scanner(System.in);
int num1 = Integer.parseInt(scan.nextLine());
int num2 = Integer.parseInt(scan.nextLine());
答案 5 :(得分:1)
补充AmitD答案:
只需复制/粘贴您的程序并输出此信息:
Error!
Enter first num:
.... infinite times ....
如您所见,指示:
n1 = input.nextInt();
输入双号时会不断抛出异常,这是因为您的流未被清除。要修复它,请按照AmitD的答案。
答案 6 :(得分:1)
@Limp,你的答案是对的,只需在阅读输入时使用.nextLine()。示例代码:
do {
try {
System.out.println("Enter first num: ");
n1 = Integer.parseInt(input.nextLine());
System.out.println("Enter second num: ");
n2 = Integer.parseInt(input.nextLine());
nQuotient = n1 / n2;
bError = false;
} catch (Exception e) {
System.out.println("Error!");
}
} while (bError);
System.out.printf("%d/%d = %d", n1, n2, nQuotient);
请阅读以下链接中导致此问题原因的说明。寻找我在这个帖子中发布的详细信息的答案。 Java Homework user input issue
好的,我将简要介绍一下。当您使用nextInt()读取输入时,您只需读取数字部分,但ENDLINE字符仍在流上。这是主要原因。现在看看上面的代码,我所做的只是读取整行并解析它,它仍然会抛出异常并按照您期望的方式工作。其余的代码工作正常。