我可以在catch语句中使用Scanner吗?

时间:2015-04-09 05:57:46

标签: java try-catch

如果我输入第一个扫描仪声明的字母,我会得到"错误!!"和"输入一个数字"但是不能输入另一个数字。我是初学者,不知道是否可以在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();
     }
 }
 }

4 个答案:

答案 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的好方法。如果用户有一个糟糕的一天并输入另一个无效的整数,扫描程序将抛出异​​常,并且它不会被捕获,因为当抛出第二个异常时你不在trycatch无法循环并再次捕获它。对此最好的习语是循环:

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可以抛出NoSuchElementExceptionIllegalStateExceptionclosed

如果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);
     }