当前位置: 首页 > 知识库问答 >
问题:

nextInt()导致无限循环

汪理
2023-03-14

我的期望:

如果用户输入的Int不在正确的范围内,程序将给他另一次机会,直到用户给出正确的类型。

所以,我需要一个while块。但我有一个无限循环。

我的代码:

import java.util.NoSuchElementException;
import java.util.Scanner;

public class TestInput {
    public static void main (String[] args) {
        boolean keepRunning = true;
        while (keepRunning) {
            try {
                System.out.println("Start --- ");
                Integer selection = inputSelection();
                //Integer selection = Integer.parseInt(selectionString);
                String email;
                switch (selection) {
                    case 1:
                        // inputDate();
                        System.out.println("Do 1");

                        break;
                    case 2:
                        //inputEmail();
                        System.out.println("Do 2");
                        break;
                    case 3:
                        //inputName();
                        System.out.println("Do 3");

                        break;
                    case 4:
                        // Exit
                        keepRunning = false;
                        break;
                    default:
                        System.out.println("Please enter a number 1 to 4: ");
                        break;
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }

    public static Integer inputSelection () {
        Integer selection = 0;
        try (Scanner scanner = new Scanner(System.in)) {
            if (scanner.hasNext()) {
                selection = scanner.nextInt();  // reads only one int. does not finish the line.
                scanner.nextLine(); // consume '\n' to finish the line
            }
        } catch (NoSuchElementException ex) {
            throw ex;
        }
        return selection;
    }
}

我读到:

重置. nextLine()扫描仪

使用扫描仪。扫描仪后面的nextLine()。nextInt()

nextInt()的扫描仪错误

扫描仪在使用next()或nextFoo()后跳过nextLine()?

如何使用java.util.扫描仪从System.in正确读取用户输入并采取行动?

Java Scanner类中的Scanner类字符串格式

Java扫描仪不等待用户输入

Java字符串扫描程序输入不等待信息,直接移动到下一条语句。如何等待信息?

Java Scanner类中的字符串格式

Scanner.html#nextInt()javase 7

扫描仪。html#nextInt()Javase 14

这些答案对我不适用。我仍然有一个无限循环。有什么建议吗?非常感谢。

编辑

首先,我输入了一个无效的选择,比如8,nextInt()将等待输入。程序将允许再次输入整数。但在第二轮中,nextInt()不等待输入。

如果我尝试这样做:

       try (Scanner scanner = new Scanner(System.in)) {
            selection = scanner.nextInt();  // reads only one int. does not finish the line.
            scanner.nextLine(); // consume '\n' to finish the line
        } catch (NoSuchElementException ex) {
            throw ex;
        }

扫描仪。nextLine()在第一轮之后将不会执行。返回到尝试(Scanner Scanner=new Scanner(System.in))关闭扫描仪。然后我得到了NoTouchElementException

编辑

主要问题是nextInt()没有在第二轮等待输入。在关闭扫描仪之前,应该有办法阻止等待输入的程序。javase 7甲骨文文档说:

公共布尔hasNext()

如果此扫描仪的输入中有另一个标记,则返回true。此方法在等待输入扫描时可能会阻塞。扫描仪不会超过任何输入。

编辑

ENV:IntelliJ IDEA 2021.2,jdk 14.0.2


共有3个答案

单于旭东
2023-03-14

scanner.hasNext()返回false,这导致它返回0,这是越界的。这是因为Scanner对象正在关闭,因此关闭System.in。检查评论以获取信用。

如果将inputSelection中的If语句替换为以下内容,它将打印e和无限循环

if (scanner.hasNext()) {
    selection = scanner.nextInt();
    scanner.nextLine();
} else {
    System.out.println("e");
    while (true) {}
}
陈正业
2023-03-14

在Java中,break语句从当前迭代中断到下一个封闭的控制级别。你似乎希望开关中的中断能在循环时将你从中断,但它只能让你脱离当前的情况。

在代表成功条件的任何情况下,而不是在失败条件下,尝试更改keepRunning标志<当你得到好的输入而不是坏的输入时,code>keepRunning应该改为false。你只想在输入错误时继续询问,对吗?

司寇嘉茂
2023-03-14

尝试将keepRunning设置为false,如果发生这种情况,则会进入案例状态。

 类似资料:
  • 我对react钩子和效果有点陌生,在使用useEffect时遇到了问题 上面的代码是我构建的useEffect,用于使用axios获取数据库中的所有数据,并且我将所有数据放在一个称为reports的状态中。 但是当我console.log报告时,它会导致无限循环。我不知道为什么? 让我给你看一个我做的简单动作。 我正在做一个按钮,当它被点击时,报告的状态(按id)将被更新。 这是该州报告结构的样本

  • 我在使用useEffect时搜索了很多关于无限循环的帖子,但仍然没有找到答案 在useEffect中,我试图调用get accounts api,当然,我放置了一个空数组,因为我只希望它在渲染后运行一次。但目前我喜欢添加“addAccount”功能。因此,如果我按下add按钮,它就会发送一个post请求。这里是一个问题,我想检查值是否已更改,因此我将值放入第二个参数,即空数组,它会导致无限循环。但

  • 问题内容: 我试图弄清楚为什么页面在单击时没有导航到其模板。URL更新,并且我没有JS错误。。我相信它 会加载 文件,但随后会无限加载控制器。我在SessionsController的实例化中添加了代码后,发现了这一点。 布局 我的看法 我的JS 在里面,我有个大而光明的人: 问题答案: 我唯一看到的是缺少括号和逗号。您可以尝试以下方法:

  • 我正在创建一个简单的议程应用程序,它作为后端连接到Firebase。我想在每次写入时获取数据,我试图避开一个无限循环。 初始todos状态为null。然而,当我获取Firebase数据时,它会发生变化,然后导致组件本身的重新渲染,这将导致另一次获取,再次导致无限循环。我已经因此打破了Firebase中火花计划的限制,并因为临时阻塞而浪费了几天的工作。我认为这可以用useCallback钩子修复,但

  • 我想要我的。htaccess文件,如果任何作为子域条目的通配符出现在浏览器上,则重定向到某个页面。i、 我想要 山姆,xyz。通用域名格式 重定向到 山姆,xyz。com/view。php?id=sam 我使用以下重写规则重定向。 重新启动引擎 重写cond%{HTTP_HOST}^www.xyz。com[NC] 重写cond%{HTTP_HOST}^([^.])。xyz。通用域名格式 重写 ^(

  • 编辑:这里是我正在使用的架构