一方面是无限循环,另一方面是NoSuchElementException

时间:2013-12-04 01:11:23

标签: java java.util.scanner infinite-loop nosuchelementexception

我最近询问是否有任何可能的方法来获取异常,将值赋给Scanner的一个String变量(线程为here:

其中一个人告诉我,CTRL + D会出现NoSuchElementException被抛出的情况。这对我来说是一种特殊情况,因为input.nextLine()返回一个String,而一个String基本上可以是用户可以在键盘上键入的任何内容,因此我们可以假设input.nextLine()不会引起关注抛出异常。

所以我决定在我正在编写的程序中添加一些try catch块,以便在程序要求输入数字时按下CTRL + D.

我遇到的问题是,当我捕获CTRL + D异常时,需要刷新Scanner,但如果我刷新Scanner,则会导致{{1因为没有新行存在而发生。我在一段时间内使用了这个真正的循环,所以我有点卡在岩石和坚硬的地方之间。

我会发布一个版本的代码,NoSuchElementException已注释掉了。如果按原样运行它,您将获得在需要刷新input.nextLine()时发生的无限循环。如果您取消注释Scanner,那么这一行代码本身会导致input.nextLine()

NoSuchElementException

除了在while循环中创建Scanner并在下一次迭代中重新创建的catch中,还可以做些什么来解决这个问题?

2 个答案:

答案 0 :(得分:0)

input.nextLine()被注释掉或input.hasNextLine()需要检查时,代码进入无限循环,因为它位于while(true)循环中,没有任何东西可以阻止它input.nextInt() 1}}未被调用。 if(input.hasNextInt())不会等待int,但如果int不作为输入存在,则只是跳过if语句中的代码。 相反,试试这个:

while(true){
    try{
        System.out.print("\nChoose Option: ");
        String in=input.nextLine();
        try{
            int i=Integer.parseInt(in);
            return i;
        }catch(NumberFormatException ex)
        {
            System.out.print("\nInvalid option");
        }
    }
    catch(NoSuchElementException e){
        System.out.print("\nAn exception occurred.");
        //input.nextLine();
    } 
} 
}

我希望这有助于我正确理解这个问题

答案 1 :(得分:0)

我不确定你完全掌握用户按下Ctrl-D时会发生什么。发生这种情况时,标准输入流将关闭。没有办法重新打开封闭的流。即使您创建了新的Scanner并将其传递到System.in,它仍会引发NoSuchElementException

作为Linux用户,如果我在交互式程序中按Ctrl-D,我希望程序终止。那就是你在这一点上所能做的一切。