当前位置: 首页 > 面试题库 >

Scanner(System.in)-无限循环

龙玄天
2023-03-14
问题内容

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

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(),您再次递归调用,这将尝试第二次使用相同的无效数据,再次失败(不使用它),然后递归。

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

所以也许是这样的:

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


 类似资料:
  • 它被声明为final,所以不能更改,正如Oracle源代码中提到的,他们说“in”是“标准”输入流。此流已经打开并准备提供输入数据。通常,此流对应于键盘输入或主机环境或用户指定的另一输入源。 这到底是什么意思?. 当我编写以下代码时:

  • 问题内容: 我正在使用以下代码: 但是,如果我输入“ w”,它将告诉我“您输入的输入无效。请重试。” 然后它将进入无限循环,显示文本“指定0到5之间的整数:您输入的输入无效。请重试。” 为什么会这样呢?该程序不是应该等待用户输入并在每次到达该语句时按Enter键: 问题答案: 在最后一个块中,您需要清除“ w”或来自扫描仪的其他无效输入。您可以通过调用Scanner并忽略其返回值来丢弃该无效输入来

  • 问题内容: 使用导致 线程“主”中的异常java.util.NoSuchElementException 当我尝试调试时说 变量信息不可用,源代码编译时没有-g选项。 并显示以下代码 我的使用此行的方法之一: 问题答案: 您即将关闭(全局变量)。 请 不要这样做。到处都有 保证将是(d)。一旦它的(d)你可以从它再次不读(或你得到你提到的)。另外,您可以使用调试符号进行编译(或使用IDE的内置调试

  • hasNext()的定义是“如果此扫描仪的输入中有另一个标记,则返回true。此方法可能会在等待输入扫描时阻塞。扫描仪不会前进超过任何输入。” 当我把 standardInput.hasNext() 放在 for 循环中时,程序会向无穷大运行。但是如果我把它放在 while-loop 中,它不会运行到无穷大。这两个程序之间的区别在哪里,为什么其中一个有效而另一个无效? for循环: while-l

  • 我有一个带感应帽的覆盆子皮。我制作了一个二进制时钟,我想在Sense hat的显示器上显示并保持更新。然而,我想要的能力,开关时钟与操纵杆中间。一切都很好,除了我的时钟的更新循环阻止任何新的输入一旦启动。 我一直在考虑如何解决这个问题。如何允许脚本/时钟保持运行,并且仍然接受来自操纵杆的新操作。但是一旦while循环开始,我就卡住了。我不知道该用谷歌搜索什么。我已经开始研究async/await,

  • 我正在用我的java书复习数据结构,我需要重新创建一个循环链表。我对这个无限循环的链表有问题,弄不清楚为什么。我可以将值插入到列表中,但是打印和删除这些值似乎会无限循环最初插入的值。我如何更改我的List类以避免无限循环? CircularList.Class 链接类