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

一旦线程在Java中抛出异常,扫描器就不会读取用户输入[重复]

颛孙麻雀
2023-03-14

我有一个单独的thread类,下面是run方法,

    @Override
    public void run() {

        Scanner scanner = new Scanner(System.in);
        int iRequestType = 0;
        int iRequestId = 0;

        while (!exit){
            try {
                System.out.print("\nRealTime - 1\nHttpUrl - 2\nSelect one : ");
                iRequestType = scanner.nextInt(); //it will wait here after the exception occurs

                System.out.print("\nEnter Request ID : ");
                iRequestId = scanner.nextInt();

                if(iRequestType == 1 && !map_RealTimeRequests.isEmpty()){
                    sendRealTimeRequest(iRequestId);
                } else if (iRequestType == 2 && !map_HttpUrlRequests.isEmpty()){
                    sendHttpUrlRequest(iRequestId);
                } else if(iRequestType > 2) {
                    System.out.println("Invalid List Number");
                }else {
                    System.out.println("Empty List");
                }
            } catch (InputMismatchException e){
                System.out.println("Invalid request type or ID : " + e);
                scanner.close();
                scanner = new Scanner(System.in);
            }

        }
    }

如果我输入数字,程序工作正常。当我输入一个字符时,它会转到catch块,并按预期执行其中的行。一旦catch块的执行完成,它将再次迭代并请求键盘输入。但是当我试图输入一个值(一个数字或一个字符)时,它不会读取任何内容,而是一直等待,而不执行下一行。我想做的是,要求用户输入一个数字,如果用户输入一个字符,在控制台中打印一条错误消息,并再次迭代while循环。我如何解决这个问题?提前感谢!

共有1个答案

卫松
2023-03-14

您不应该调用scanner.close(),因为这会关闭system.in。您不想关闭系统。在中,您只想清除缓冲区。可以像以前那样替换扫描器(不调用close()),或者如果是单行输入,可以调用nextline(),如下所示:

} catch (InputMismatchException e){
  System.out.println("Invalid request type or ID : " + e);
  scanner.nextLine();
}
 类似资料:
  • 问题内容: 我正在尝试编写此方法,该方法会不断从用户那里读取内容,直到输入单词“ exit”为止。我尝试了一个for和break循环;它没有用。我尝试了一段时间,但即使输入了“退出”一词也不会停止。任何想法如何解决这一问题?谢谢。 问题答案: 是错的。 你要 要么 分别取决于exit是变量还是字符串文字。在Java中,表示引用相等(例如,这两个引用指向内存中的相同地址),而。表示对象等效项,通常在

  • 问题内容: 我正在使用Java的扫描仪读取用户输入。如果我仅使用nextLine一次,那就可以了。使用两个nextLine时,第一个不会等待用户输入字符串(第二个会输入)。 输出: X:Y :(等待输入) 我的密码 任何想法为什么会发生这种情况?谢谢 问题答案: 您可能像以前那样调用方法。这样的程序是这样的: 演示您所看到的行为。 问题是不消耗,因此下一个调用将消耗它,然后等待读取的输入。 您需要

  • 我有以下课程 我不能输入歌曲名nr 1,因为它总是同时显示前两首歌。 如果我输入3,就像这样:

  • 我试着关闭扫描仪,但这也导致了一个错误...有人能帮我弄明白怎么回事吗?我想提示用户输入一个有效的整数,如果输入无效,则继续提示。 谢了!

  • 我正在使用Java的扫描仪读取用户输入。如果我只使用nextLine一次,它可以正常工作。对于两个nextLine,第一个不等待用户输入字符串(第二个)。 输出: X:Y:(等待输入) 我的代码 你知道为什么会发生这种事吗?谢谢