Java 扫描仪(系统中)-无限循环

Java 扫描仪(系统中)-无限循环,java,java.util.scanner,Java,Java.util.scanner,为什么我在递归方法中得到无限循环,却没有机会输入任何符号来打破它 class Test { int key=0; void meth(){ System.out.println("Enter the number here: "); try(Scanner scan = new Scanner(System.in)) { key = scan.nextInt(); System.out.println(key+1); }

为什么我在递归方法中得到无限循环,却没有机会输入任何符号来打破它

class Test {
   int key=0;
   void meth(){
     System.out.println("Enter the number here: ");
     try(Scanner scan = new Scanner(System.in)) {
        key = scan.nextInt();
        System.out.println(key+1);
     } catch(Exception e) {
        System.out.println("Error");
        meth();
     }
   }
}

class Demo {
  main method {
    Test t = new Test();
    t.meth();
  }
} 
如果您试图创建一个错误(将字符串值放入键中,然后尝试向其中添加一个数字),您将在控制台中得到无限的“错误”文本,而不是第一个错误后,程序应该再次询问该数字,然后才决定如何做。

如果
nextInt()
失败,它抛出异常,但不使用无效数据。从:

当扫描器抛出一个
InputMismatchException
时,扫描器将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌

然后再次递归调用
meth()
,这将再次尝试使用相同的无效数据,再次失败(不使用),然后递归

首先,我不会在这里使用递归。喜欢简单的循环。接下来,如果您有无效的输入,您应该在重试之前适当地使用它。最后,考虑使用<代码> HasNeXTeNe>代码>,而不只是使用<代码> NExtTeN>代码>并捕获异常。

所以可能是这样的:

import java.util.Scanner;

class Test {
   public static void main(String[] args){
       try (Scanner scanner = new Scanner(System.in)) {
           System.out.println("Enter the number here:");
           while (!scanner.hasNextInt() && scanner.hasNext()) {
               System.out.println("Error");
               // Skip the invalid token
               scanner.next();
           }
           if (scanner.hasNext()) {
               int value = scanner.nextInt();
               System.out.println("You entered: " + value);
           } else {
               System.out.println("You bailed out");
           }
       }
   }
}
如果
nextInt()
失败,它将抛出异常,但不会使用无效数据。从:

当扫描器抛出一个
InputMismatchException
时,扫描器将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌

然后再次递归调用
meth()
,这将再次尝试使用相同的无效数据,再次失败(不使用),然后递归

首先,我不会在这里使用递归。喜欢简单的循环。接下来,如果您有无效的输入,您应该在重试之前适当地使用它。最后,考虑使用<代码> HasNeXTeNe>代码>,而不只是使用<代码> NExtTeN>代码>并捕获异常。

所以可能是这样的:

import java.util.Scanner;

class Test {
   public static void main(String[] args){
       try (Scanner scanner = new Scanner(System.in)) {
           System.out.println("Enter the number here:");
           while (!scanner.hasNextInt() && scanner.hasNext()) {
               System.out.println("Error");
               // Skip the invalid token
               scanner.next();
           }
           if (scanner.hasNext()) {
               int value = scanner.nextInt();
               System.out.println("You entered: " + value);
           } else {
               System.out.println("You bailed out");
           }
       }
   }
}
如果
nextInt()
失败,它将抛出异常,但不会使用无效数据。从:

当扫描器抛出一个
InputMismatchException
时,扫描器将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌

然后再次递归调用
meth()
,这将再次尝试使用相同的无效数据,再次失败(不使用),然后递归

首先,我不会在这里使用递归。喜欢简单的循环。接下来,如果您有无效的输入,您应该在重试之前适当地使用它。最后,考虑使用<代码> HasNeXTeNe>代码>,而不只是使用<代码> NExtTeN>代码>并捕获异常。

所以可能是这样的:

import java.util.Scanner;

class Test {
   public static void main(String[] args){
       try (Scanner scanner = new Scanner(System.in)) {
           System.out.println("Enter the number here:");
           while (!scanner.hasNextInt() && scanner.hasNext()) {
               System.out.println("Error");
               // Skip the invalid token
               scanner.next();
           }
           if (scanner.hasNext()) {
               int value = scanner.nextInt();
               System.out.println("You entered: " + value);
           } else {
               System.out.println("You bailed out");
           }
       }
   }
}
如果
nextInt()
失败,它将抛出异常,但不会使用无效数据。从:

当扫描器抛出一个
InputMismatchException
时,扫描器将不会传递导致异常的令牌,因此可以通过其他方法检索或跳过该令牌

然后再次递归调用
meth()
,这将再次尝试使用相同的无效数据,再次失败(不使用),然后递归

首先,我不会在这里使用递归。喜欢简单的循环。接下来,如果您有无效的输入,您应该在重试之前适当地使用它。最后,考虑使用<代码> HasNeXTeNe>代码>,而不只是使用<代码> NExtTeN>代码>并捕获异常。

所以可能是这样的:

import java.util.Scanner;

class Test {
   public static void main(String[] args){
       try (Scanner scanner = new Scanner(System.in)) {
           System.out.println("Enter the number here:");
           while (!scanner.hasNextInt() && scanner.hasNext()) {
               System.out.println("Error");
               // Skip the invalid token
               scanner.next();
           }
           if (scanner.hasNext()) {
               int value = scanner.nextInt();
               System.out.println("You entered: " + value);
           } else {
               System.out.println("You bailed out");
           }
       }
   }
}