如果我输入第一个扫描仪声明的字母,我会得到"错误!!"和"输入一个数字"但是不能输入另一个数字。我是初学者,不知道是否可以在catch语句中使用输入语句
import java.util.InputMismatchException;
import java.util.Scanner;
public class excep {
public static void main(String args[]){
int n;
Scanner input=new Scanner(System.in);
try{
System.out.println("ENTER A NUMBER: ");
n=input.nextInt();
}
catch(InputMismatchException e){
System.out.println("ERROR!!! \nENTER A NUMBER :");
n=input.nextInt();
}
}
}
答案 0 :(得分:4)
在重新启动输入之前,必须要从缓冲区中进食或删除字符。为简单起见,您的代码应该看起来很相似:
while(true) {
Scanner input=new Scanner(System.in);
try {
System.out.println("ENTER A NUMBER: ");
n=input.nextInt();
break;
}catch(InputMismatchException e) {
System.out.println("ERROR!!! \nENTER A NUMBER :");
input.next(); // eat some chars
}
}
答案 1 :(得分:3)
您的方法遇到的最大问题是,如果nextInt()
因用户未输入有效整数而失败,则扫描程序不会前进。扫描仪有一个指针,指向要从输入读取的下一个字符。当您使用nextInt()
时,如果下一个"令牌"是一个整数,扫描器会使指针超过整数。但如果它不是整数,则抛出异常 - 并且指针与以前保持在同一位置。因此,当您捕获异常,然后调用nextInt()
时,扫描程序会尝试读取上次尝试读取的同一个无效整数。
要跳过错误的整数,您可以说input.next()
跳过一个标记,或input.nextLine()
跳过整个输入行的其余部分,然后再尝试读取另一个整数。 (这两个都会返回String
个结果,但您可以放弃结果,因为它对您来说并不重要。)
但是,这不是使用try/catch
的好方法。如果用户有一个糟糕的一天并输入另一个无效的整数,扫描程序将抛出异常,并且它不会被捕获,因为当抛出第二个异常时你不在try
。 catch
无法循环并再次捕获它。对此最好的习语是循环:
boolean validIntegerEntered = false;
System.out.println("ENTER A NUMBER: ");
while (!validIntegerEntered) {
try {
n=input.nextInt();
validIntegerEntered = true; // will not get here if nextInt()
// throws an exception
}
catch (InputMismatchException e) {
input.nextLine(); // let the scanner skip over the bad input
System.out.println("ERROR!!! \nENTER A NUMBER :");
// don't call nextInt() here; loop back, and nextInt() will be called
// in the try statement
}
}
答案 2 :(得分:2)
从语法上讲,是的,你可以,但你不应该使用它。为什么呢?
如果扫描程序为input.nextInt();
, InputMismatchException
可以抛出NoSuchElementException
或IllegalStateException
或closed
。
如果catch块中出现任何异常,则表示您没有处理它们。您应该查看how to implement a retry catch
答案 3 :(得分:0)
您正在使用input.nextInt(),意味着它只能接受int值。如果您想输入字符串值,那么最好使用input.nextine()。 在catch块中的代码中你再次使用input.nextInt()但是扫描程序已经输错了它为什么抛出异常。如果你想在catch块中输入,那么试试下面的代码:
catch(InputMismatchException e){
System.out.println("ERROR!!! \nENTER A NUMBER :");
Scanner input1=new Scanner(System.in);
n=input1.nextInt();
System.out.println("Inside catch:"+n);
}