Scanner(System.in)-无限循环 [英] Scanner(System.in) - infinite loop

查看:63
本文介绍了Scanner(System.in)-无限循环的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

为什么我在递归方法中遇到了无限循环,而没有机会输入任何符号来破坏它?

Why I'm getting infinite loop in recursion method, without a chance to input any symbol to break it?

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();
  }
} 

如果您尝试创建错误(将字符串值放入键中,然后尝试向其添加数字),则您将在控制台中获得无限的错误"文本,取而代之的是,在出现第一个错误之后,程序应再次询问数字,然后才决定要做什么.

If you try to create an error (putting string value in key and then try to add to it a number), you will get infinite "Error" text in console, instead of that, after first error, program should ask again the number and only then decide what to do.

推荐答案

如果nextInt()失败,它将引发异常,但不会使用无效数据.从文档:

If nextInt() fails, it throws an exception but doesn't consume the invalid data. From the documentation:

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

When a scanner throws an InputMismatchException, the scanner will not pass the token that caused the exception, so that it may be retrieved or skipped via some other method.

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

You're then recursively calling meth() again, which will try to consume the same invalid data a second time, fail again (without consuming it), and recurse.

首先,我不会在这里首先使用递归.最好选择一个简单的循环.接下来,如果输入无效,则应在再次尝试之前适当地使用它.最后,考虑使用hasNextInt而不是仅使用nextInt并捕获异常.

Firstly, I wouldn't use recursion here in the first place. Prefer a simple loop. Next, if you have invalid input you should consume it appropriately before trying again. Finally, consider using hasNextInt instead of just using nextInt and catching the exception.

所以也许是这样的:

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");
           }
       }
   }
}

这篇关于Scanner(System.in)-无限循环的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆