【问题标题】:Multiple Input Validation Consolidation Java多输入验证合并 Java
【发布时间】:2017-03-11 15:37:02
【问题描述】:

当我从用户那里得到输入时,我想确保两者都是:

  • 一个数字
  • 大于最小值

我编写了以下代码来实现这一点,但它似乎比它必须的更复杂。有没有办法整合问题输入的是一个数字,这个数字是否小于十,或任何类似的两部分验证?

// function prompts user for a double greater than number passed in
// continues to prompt user until they input a number greater than
// the minimum number 
public static double getInput(double minimumInput) {
   Scanner scan = new Scanner(System.in);
   double userInput;

   System.out.print("Enter a number greater than " + minimumInput + ": ");
   while (!scan.hasNextDouble()){
      String garbage = scan.next();
      System.out.println("\nInvalid input.\n");
      System.out.print("Enter a number greater than " + minimumInput + ": ");
   } // end while

   userInput = scan.nextDouble();

   while (userInput <= minimumInput) {
      System.out.println("\nInvalid input.\n");
      userInput = getInput(minimumInput);
   }

   return userInput;
} // end getInput

【问题讨论】:

    标签: java validation input java.util.scanner consolidation


    【解决方案1】:

    简单的回答:没有。

    你看,用户输入可以是任何东西。如果您不使用“nextDouble()”方法,您的代码甚至必须将字符串转换为数字。但是java中没有办法说:这个东西是一个double,并且它必须小于其他一些值。

    您必须明确地将该约束“放入”代码中。从这个角度来看,您现在拥有的代码很好。我什至认为这比其他答案中的提议要好,该提议试图将所有这些测试填充到一个 if 条件中。

    你看,好的代码很容易被阅读和理解。当然,“更少的代码”通常更容易阅读,但有时“多一点”的代码可以比更短的版本更快地理解!

    【讨论】:

    • 我建议您删除答案的最后一部分,因为对于该知识水平的人来说信息太多了。
    • 这样做了;并更多地关注他问题的“风格”方面。有效的建议,谢谢!
    • 感谢您的反馈!
    【解决方案2】:

    你可以使用 ||短电路 OR 运算符用于合并两个验证,如下所示:

    public static double getInput(double minimumInput) {
               Scanner scan = new Scanner(System.in);
               double userInput =0;
               System.out.print("Enter a number greater than " + minimumInput + ": ");
               //Combine two vlidations using || operator
               while (!scan.hasNextDouble() ||  ((userInput=scan.nextDouble()) < minimumInput)){
                  System.out.println("\nInvalid input.\n");
                  System.out.print("Enter a number greater than " + minimumInput + ": ");
               } // end while
               return userInput;
            } // end getInput
    

    有关以下运营商的更多详细信息,请参阅以下链接: https://docs.oracle.com/javase/tutorial/java/nutsandbolts/op2.html

    【讨论】:

    • 我认为这是在错误的方向。良好的编码风格是关于可读性。因此:容易理解的条件。令人惊讶的是,使用 NOT 和 OR 的 if 以及方法调用和 不容易 易于理解。
    • 感谢您的反馈,这就是我正在寻找的想法。但是,您的代码存在错误。如果我输入一个小于 minimumInput 的数字,它可以正常工作,但如果我输入一个字符串,代码会进入无限循环,因为参数 !scan.hasNextDouble 的计算结果为 false 并且不会“清除”扫描仪(不确定我是否在解释没错)。您对如何解决该问题有任何想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2013-11-28
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多