我可以在 catch 语句中使用 Scanner

Can i use Scanner within a catch statement

如果我为第一个 Scanner 语句输入字母,我得到 "error!!" 和 "enter a number" 但不能输入另一个 number.I 我是初学者,不知道是否可以输入语句在 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();
     }
 }
 }

从句法上讲,是的,你可以,但你不应该使用它。为什么?

如果扫描器是 closed

input.nextInt(); 可以抛出 InputMismatchExceptionNoSuchElementExceptionIllegalStateException

如果这些异常中的任何一个发生在 catch 块中,则您没有处理它们。你应该看看 how to implement a retry catch

你正在使用 input.nextInt(),意味着它只能接受 int values.If 你想输入字符串值,那么最好使用 input.nextine()。 在 catch 块中的代码中,您再次使用 input.nextInt() 但扫描器中已经输入了错误的内容,这就是为什么它会抛出 exception.If 您想在 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);
     }

在重新开始输入之前,您必须从缓冲区中吃掉或删除字符。为了简单起见,您的代码应该看起来相似:

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
 }
}

您的方法最大的问题是,如果 nextInt() 由于用户未输入有效整数而失败,则扫描器不会前进。扫描仪有一个指针指向下一个要从输入中读取的字符。当您使用 nextInt() 时,如果下一个 "token" 是一个整数,则扫描器会将指针前进到该整数之后。但如果它不是一个整数,就会抛出一个异常——指针会保持在原来的位置。因此,当您捕捉到异常,然后调用 nextInt() 时,扫描器会尝试读取它上次尝试读取的同一个无效整数。

要跳过错误的整数,您可以说 input.next() 跳过一个标记,或者说 input.nextLine() 跳过输入行的整个剩余部分,然后再尝试读取另一个整数。 (这两个 return 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
    }
}