我正在制作一个基础应用程序来训练你的数学技能。我有这段代码:
while (true)
{
try
{
int userAnswer;
System.out.println("Type quit to exit to the menu!");
int randInt = r.nextInt(num2);
System.out.println(num1 + " + " + randInt + " =");
userAnswer = in.nextInt();
if(userAnswer == num1 + randInt) System.out.println("Correct!");
else System.out.println("Wrong!");
break;
}
catch(Exception e)
{
}
}
当有人在答案中打印出d或其他东西时,试试捕获就会消失。但是,然后它进入while循环并反复发送类型退出以退出菜单然后像1 + 2 =无限的...我想我知道什么是错的,userAnswer已被指定为抛出一个异常进入catch并且它只是继续打印它们并转到catch并返回,因为userAnswer已经被分配。我认为这就是正在发生的事情,我可能是错的。请帮忙!
编辑:我忘记说清楚了,但是我想再次重新打印这个问题,退出循环进入一个菜单,你不能回答问题,我想让它重做尝试捕获的内容......答案 0 :(得分:0)
如果不处理它,你永远不应该捕获异常。
catch(Exception e)
{
System.out.println("An error has occured");
break;
}
如果发生Exception
,这应该会阻止程序无限循环。
答案 1 :(得分:0)
如果用户输入以字母形式出现,则会因为您尝试读取(解析)为整数而获得异常。所以你的catch子句在循环中你必须在那里编写break来从循环中走出来。 我仍然建议你将getline作为字符串,然后与你的cli命令(在你的情况下退出)比你可以尝试将其解析为整数和处理循环逻辑。
答案 2 :(得分:0)
如果不匹配,你不会打破while循环
<video width="400px" height="300px" autoplay loop>
<source ng-attr-src="{{videos[currentVideo].url}}" type="video/mp4" />
</video>
答案 3 :(得分:0)
如果发生异常,你不会打破循环。
在library(MASS)
data(menarche)
glm.out = glm(cbind(Menarche, Total-Menarche) ~ Age,
family=binomial(logit), data=menarche)
coefficients(glm.out)
## (Intercept) Age
## -21.226395 1.631968
块中添加break;
语句以运行程序而不会进行无限循环,以防发生异常。
答案 4 :(得分:0)
由于给定的答案与您的要求不符,我将为您解决这个“谜语”。
我猜你不知道的是,如果扫描器与预期不符,扫描器将不会读取下一个令牌。因此,如果您拨打in.nextInt()
并且下一个标记不是一个数字,则扫描程序将抛出InputMismatchException
并保持阅读器位置。因此,如果再次尝试(由于循环),它将再次抛出此异常。为避免这种情况,您必须使用错误的令牌:
catch (Exception e) {
// exception handling
in.next();
}
这会消耗坏令牌,因此in.nextInt()
可以接受新令牌。此外,无需在此处添加break
。
请注意in.next()
只读取一个标记,该标记由空格分隔。因此,如果用户输入a b c
,那么您的代码将抛出三个异常,因此生成三个不同的问题,因为用户可以输入一个数字。您可以使用in.nextLine()
来避免这种情况。但这可能导致另一个问题:Scanner issue when using nextLine after nextXXX,所以要注意:)。