例如,像这样。
while ((input = kb.nextInt()) != 0) {
if (input % 2 == 0) {
System.out.println("even");
} else {
System.out.println("odd");
}
而不是只在条件里面检查输入变量的值,然后在循环里面从Scanner获取数字,像这样。
while (input != 0) {
input = kb.nextInt();
...code here...
我只是想知道第一种做法是否不好,或者有什么问题。
使用 nextInt()
作为循环条件的一部分,虽然是完全合法的,但从处理以下情况引起的错误的角度来看,可能会有问题。坏输入. 坐在键盘前输入数据的实际人类(这是 Scanner
变量名 kb
似乎表明,正是你在这里处理)是众所周知的不可靠的数据输入质量,所以。坏输入 是你应该做好的准备。
nextInt()
会抛出 InputMismatchException
如果下一个可用的输入不是一个整数的有效表示,则会出现异常。 为了捕获和处理这个异常,在 nextInt()
调用必须在 try
块。 然而,随着 nextInt()
是《公约》控制条件的一部分 while
循环,唯一的办法是将整个循环包围在 try
块。
try {
while ((input = kb.nextInt()) != 0){
...
}
} catch (InputMismatchException ime){
...
}
不幸的是,这意味着任何由 nextInt()
会死 while
循环。 如果你想在输入错误后继续处理用户输入,你必须提供一种方法来启动 while
循环,并继续重启,直到达到 "真正的 "用户信号输入结束条件。 您 可能 能够用一个笨拙的工作方法来做,比如这个。
boolean keepGoing = true;
while (keepGoing){
try {
while ((input = kb.nextInt()) != 0) {
...
}
keepGoing = false;
} catch (InputMismatchException ime) {
String junk = kb.next();
System.out.println("Didn't understand your input: " + junk);
System.out.println("Please type a valid integer");
}
}
但是取决于 ...
循环内的代码在做什么,这种相对简单的变通方法可能是不够的;你可能需要一些更复杂和不可读的东西。
但是通过移动 nextInt()
从环路的控制逻辑调用到环路主体,您在从不良输入恢复的选择上获得了相当大的灵活性。 有了 nextInt()
内的异常,现在你可以完全在循环的一次迭代中捕获并处理任何异常,而不必终止循环本身。
do {
try {
input = kb.next();
if (input != 0) {
...
}
} catch (InputMismatchedException ime) {
String junk = kb.next();
System.out.println("Didn't understand your input: " + junk);
System.out.println("Please type a valid integer");
}
} while (input != 0);
你也可以选择通过使用 hasNextInt()
以确保在尝试读取之前有一个有效的输入。nextInt()
:
do {
if (!kb.hasNextInt()) {
{
String junk = kb.next();
System.out.println("Didn't understand your input: " + junk);
System.out.println("Please type a valid integer");
} else if (input != 0) {
...
}
} while (input != 0);
第二个没有定义测试条件的输入。input!=0
因此,第一种格式是正确的,但如果你要使用第二种格式,我建议你改变一下 while
循环到 do-while
循环。
你的两个代码样本并不等同,而且做的事情也不一样(第二个版本可能做的不是你想让它做的事情)。if (input != 0)
循环内,并赋予 input
循环之前的第二个版本。把赋值移到最后,在循环前重复也是一个可行的方案。
input = kb.nextInt();
while (input != 0) {
if (input % 2 == 0) {
System.out.println("even");
} else {
System.out.println("odd");
}
input = kb.nextInt();
}
而这个版本中重复的第一行和最后一行 很可能是代码有点复杂的原因。这种类型的循环 loop ((x = input()) != 0)
可以在很多C代码中看到,但在Java中有时也是 "必需的",当你想在处理输入时减少代码的重复。这是由以下事实造成的 nextInt
返回一个值并改变底层状态。