【问题标题】:Using while loops to validate input使用 while 循环来验证输入
【发布时间】:2014-10-17 17:19:19
【问题描述】:

我想让用户只输入“y”“Y”“n”或“N”。结果代码要求用户在输入正确的输入后输入 Y 或 N,这与我通过放置 !在 input.equalscaseignore(input) 前面。


import java.util.Scanner;


class inputVal {

    public static void main(String[] args) {
        String Input;
        Scanner keyboard = new Scanner(System.in);

        System.out.println("Please enter Y or N. ");
        Input = keyboard.nextLine();

        while (!Input.equalsIgnoreCase("Y") || !Input.equalsIgnoreCase("N"))
        {
            System.out.println("Please enter Y or N");
            Input = keyboard.nextLine();

        }


        keyboard.close();
    }

}

【问题讨论】:

  • 问题是如果用户输入 N 则 !Input.equalsIgnoreCase("Y") 变为真 ..如果用户输入 Y 则 !Input.equalsIgnoreCase("N") 变为真所以它总是到while里面

标签: java validation input


【解决方案1】:

这是您的or 条件,您必须将其更改为and

while (!Input.equalsIgnoreCase("Y") && !Input.equalsIgnoreCase("N"))

大声朗读有助于理解逻辑:

WHILE 输入不等于(忽略大小写)“Y”AND 输入不等于(忽略大小写)“N”

【讨论】:

    【解决方案2】:

    详细说明@gtgaxiola 的回答:

    !Input.equalsIgnoreCase("Y") || !Input.equalsIgnoreCase("N")
    

    假设Input"Y"|| 的左操作数是 false,因为 Input 等于 "Y"。但右操作数是true,因为Input 不等于"N"。而false || truetrue,因为只要任一操作数是true|| 的结果就是true。事实上,无论Input 是什么,这个表达式总是会是true

    这就是为什么你需要使用&&

    !Input.equalsIgnoreCase("Y") && !Input.equalsIgnoreCase("N")
    

    因为只有当 both equalsIgnoreCase 调用返回 false 时,您才希望结果为 true

    或者,你可以说

    ! (Input.equalsIgnoreCase("Y") || Input.equalsIgnoreCase("N"))
    

    另请参阅DeMorgan's Laws 上的这篇文章。

    (顺便说一句,Java 中的约定是使用以小写字母开头的变量名,即input。)

    【讨论】:

      【解决方案3】:

      你的布尔逻辑是什么在杀死你

      while (!Input.equalsIgnoreCase("Y") || !Input.equalsIgnoreCase("N"))
      

      您想在输入不是 Y AND 不是 N 时处于循环中,因此您需要将其更改为

      while (!Input.equalsIgnoreCase("Y") && !Input.equalsIgnoreCase("N"))
      

      【讨论】:

        【解决方案4】:

        我的代码逻辑生锈了,但我相信问题出在 ||操作数。

        其中一个答案将始终为 FALSE,因此它不会正确进入循环。

        【讨论】:

          【解决方案5】:

          这是一个很好的工具来跟踪您的代码: http://cscircles.cemc.uwaterloo.ca/java_visualize/#

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-03-08
            • 2021-05-13
            • 2016-10-22
            • 2016-05-27
            • 2015-05-05
            • 1970-01-01
            • 1970-01-01
            • 2013-09-25
            相关资源
            最近更新 更多