将Java Scanner的输入分配到while循环条件里面的变量中可以吗?

问题描述 投票:0回答:1

例如,像这样。

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...

我只是想知道第一种做法是否不好,或者有什么问题。

java while-loop java.util.scanner
1个回答
0
投票

使用 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);

0
投票

第二个没有定义测试条件的输入。input!=0 因此,第一种格式是正确的,但如果你要使用第二种格式,我建议你改变一下 while 循环到 do-while 循环。


0
投票

你的两个代码样本并不等同,而且做的事情也不一样(第二个版本可能做的不是你想让它做的事情)。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 返回一个值并改变底层状态。

© www.soinside.com 2019 - 2024. All rights reserved.