Scanner
我最近询问是否有任何可能的方法可以通过使用(线程在这里:)将值分配给字符串变量来获得异常
其中一个人告诉我 CTRL+D 是NoSuchElementException
可以抛出 a 的情况。这对我来说是一种特殊情况,因为input.nextLine()
返回一个字符串,而一个字符串基本上可以是用户可以在键盘上键入的任何内容,因此人们会认为input.nextLine()
抛出异常不是问题。
因此,我决定在我正在编写的程序中添加一些 try catch 块,以防在程序要求输入数字时按下 CTRL+D。
我遇到的问题是,当我捕获 CTRL+D 异常时,Scanner
需要刷新,但是如果我刷新Scanner
,它将导致 aNoSuchElementException
发生,因为不存在新行。我在一个真正的循环中使用这一切,所以我有点卡在岩石和坚硬的地方之间。
我将发布一个版本的代码,input.nextLine()
注释掉。如果您按原样运行它,您将获得在Scanner
需要刷新时发生的无限循环。如果您取消注释input.nextLine()
,那一行代码本身就会导致NoSuchElementException
.
import java.util.NoSuchElementException;
private int getMainOptions(){
System.out.printf("\n********** Main Options **********");
System.out.printf("\n*%32s*", "");
System.out.printf("\n* %-30s*", "[1] Create Customer");
System.out.printf("\n* %-30s*", "[2] Create Reservation");
System.out.printf("\n* %-30s*", "[3] Display Customer");
System.out.printf("\n* %-30s*", "[4] Display Reservation");
System.out.printf("\n*%32s*", "");
System.out.printf("\n**********************************");
while(true){
try{
System.out.print("\nChoose Option: ");
if(input.hasNextInt()){
return input.nextInt();
}
System.out.print("\nInvalid option");
input.nextLine();
continue;
}
catch(NoSuchElementException e){
System.out.print("\nAn exception occurred.");
//input.nextLine();
}
}
}
除了在 while 循环中创建 Scanner 并在 catch 中将其销毁以在下一次迭代中重新创建之外,可以做些什么来解决这个问题?