每次运行此代码时,控制台都会进入无限循环打印“请输入一个数字”。我不明白为什么会这样。提前谢谢。
boolean check = true;
int temp = 0;
while(check==true){
try{
temp= asker.nextInt();
check = false;
}
catch(InputMismatchException e){
System.out.println("Please input a number.");
}
}
编辑:asker是一名扫描仪。代码的目的是循环,直到用户输入整数。
答案 0 :(得分:4)
方法asker.NextInt()
抛出InputMismatchException
,表示从asker
收到的输入(假设它是Scanner
)实际上不是整数。此异常导致循环重新启动而不将check
设置为false。
在catch块中打印异常以获取有关失败的更多信息。但最有可能的是,你正在为你的应用程序提供一些实际上不包含整数值的东西(很多很多东西,如果它像这样循环)。
答案 1 :(得分:1)
你永远不想实际“使用”try / catch - 我的意思是不要将它用作程序逻辑的一部分 - 这就是你正在做的事情。
一个大问题是,与您的应用程序一样,您看不到堆栈跟踪。在异常中吃堆栈跟踪几乎总是错误的。
如果必须捕获异常,请尽可能在catch附近处理它,但最好设置代码,以便无论如何都不能抛出异常。
如果您的老师告诉您这样做,请放弃此建议,但请记住,在您的脑海中,这是一种糟糕的形式。
另外不要告诉你的老师这是不好的形式:)他或者不知道在哪种情况下他不会理解为什么或他知道并且正在使用它来向你展示try / catch是如何工作的。
答案 2 :(得分:0)
什么是asker
,Scanner
?如果nextInt()
失败,它不会消耗任何输入,所以当你捕获异常并循环回来再试一次时,它最终只会再次读取相同的错误输入。
您应该在catch
块中执行某些操作以使用无效输入,以便下次可以读取某些不同的输入。可以调用asker.nextLine()
,并忽略返回值。
答案 3 :(得分:0)
你需要打破循环并报告循环发生的原因
boolean NotValid = true;
int temp = 0;
while(NotValid){
try{
temp= asker.nextInt();
NotValid = false;
break; // stop
}
catch(InputMismatchException e){
System.out.println("Please input a number. reason why:");
System.out.println(e);
NotValid = true;
}
}