【问题标题】:Can i use Scanner within a catch statement [duplicate]我可以在 catch 语句中使用 Scanner [重复]
【发布时间】:2015-04-09 05:57:46
【问题描述】:

如果我在第一个 Scanner 语句中输入字母,我会收到“错误!!”和“输入一个数字”但不能输入另一个数字。我是初学者,不知道输入语句是否可以在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();
     }
 }
 }

【问题讨论】:

  • 你有什么错误吗?
  • 这里有一些关于它的东西。 stackoverflow.com/questions/12702076/…
  • 是的.... java.util.Scanner.throwFor(Unknown Source) at java.util.Scanner.next(Unknown Source) at java.util.InputMismatchException in thread "main" java.util.InputMismatchException .util.Scanner.nextInt(Unknown Source) at java.util.Scanner.nextInt(Unknown Source) at excep.rajath.main(rajath.java:14)
  • @VinceEmigh 你可以使用next() 而不是nextLine()next() 停在任何空白处,无论是否换行。这就是为什么我不相信你需要考虑换行。不过,我还是会使用nextLine()

标签: java try-catch


【解决方案1】:

在重新开始输入之前,您必须从缓冲区中吃掉或删除字符。为简单起见,您的代码应如下所示:

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

【讨论】:

    【解决方案2】:

    您的方法最大的问题是,如果 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
        }
    }
    

    【讨论】:

      【解决方案3】:

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

      input.nextInt(); 可以抛出 InputMismatchExceptionNoSuchElementExceptionIllegalStateException 如果扫描仪是 closed

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

      【讨论】:

        【解决方案4】:

        您正在使用 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);
             }
        

        【讨论】:

        • 扫描仪在 try 块之外,为什么它会被关闭。
        • 两次输入字母(非数字)会怎样?
        • 您不应该两次创建扫描仪对象。
        • 不,它不会关闭,但它会尝试将下一个令牌扫描为 int 但在扫描仪中已经输入错误,这就是它抛出异常的原因。
        猜你喜欢
        • 1970-01-01
        • 2010-11-25
        • 1970-01-01
        • 2014-02-03
        • 1970-01-01
        • 2014-06-05
        • 2014-06-18
        • 2021-08-08
        • 2014-04-19
        相关资源
        最近更新 更多