我最近询问是否有任何可能的方法来获取异常,将值赋给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中,还可以做些什么来解决这个问题?
答案 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,我希望程序终止。那就是你在这一点上所能做的一切。