【问题标题】:Validating multiple Inputs with Scanner使用 Scanner 验证多个输入
【发布时间】:2015-02-13 01:16:34
【问题描述】:

我正在尝试为我的程序中的错误输入创建一些输入验证。

该程序应该将用户输入读取为双精度,但如果用户键入字母而不是数字,它必须显示输入不是数字的消息。

为此,我将 input.hasNextDouble 与 if 语句一起使用。 else 打印 x 不是数字的消息。但是,我的问题在于用户输入的第二个数字。假设用户输入“5 f”,hasNextDouble解释了double,然后执行if语句下的代码,但是由于“f”,输入仍然不正确。

简而言之,我需要一种方法将第一个输入 (5) 从缓冲区中删除,以便可以解释第二个输入。

感谢任何帮助!

这里是一些示例代码:

if ( keyboard.hasNextDouble() ) {


                    double i = keyboard.nextDouble();
                    double j = keyboard.nextDouble();
                    double answer = (j+i );
                    System.out.println(answer);

            }


                else  {
                    String a = keyboard.next();
                    String b = keyboard.next(); 
                    System.out.println( a + "is not a number");

【问题讨论】:

  • 提示:你只检查了一次hasNextDouble(),但你调用了两次nextDouble()

标签: java validation java.util.scanner


【解决方案1】:
double i,j, answer;
try{
     i = keyboard.nextDouble();
     j = keyboard.nextDouble(); 
     answer = i+j;
} catch( InputMismatchException e ) {
    // One of the inputs was not a double
    System.out.println("Incorrect format");
}

否则,如果您绝对需要打印出哪个不正确,我只会执行 if-then 您有两次。

double i=null, j=null, answer;
// get input for i
if ( keyboard.hasNextDouble() ) {
        i = keyboard.nextDouble();
}else{
        System.out.println( keyboard.next() + " is not a double");
}
// get input for j
if ( keyboard.hasNextDouble() ) {
        j = keyboard.nextDouble();
}else{
        System.out.println( keyboard.next() + " is not a double");
}
// if both i and j received inputs             
if( i != null && j != null )
       answer = i + j;
else
       System.out.println("Malformed input");

【讨论】:

  • 你的第二个例子很有帮助,谢谢!但是,如果输入错误,我需要程序只打印一条语句。例如:a b ----( print 应该只是 "a is not a number") - 5 b ---- ( print 应该显示 "b is not a number" ) - 有什么建议吗?
  • 这就是 if-then 子句在第二个示例中所做的事情。如果keyboard.hasNextDouble() 返回false,它会从下一个字符串打印出实际输入的内容,以及“不是双精度”
【解决方案2】:

你需要类似下面的东西。

double tryReadDouble(Scanner keyboard) throws NumberFormatException {
    if (keyboard.hasNextDouble()) {
        return keyboard.nextDouble();
    } else {
        throw new NumberFormatException(keyboard.next());
    }
}

try {
    double i = tryReadDouble(keyboard);
    double j = tryReadDouble(keyboard);
    double answer = (j + i);
    System.out.println(answer);
} catch (NumberFormatException ex) {
    System.out.println(ex.getMessage() + "is not a number");
}

希望这会有所帮助。

【讨论】:

    【解决方案3】:

    您可以创建帮助方法,该方法将要求用户输入有效输入,直到它得到一个,或者直到超出某些尝试限制。这样的方法可以是这样的:

    public static double getDouble(Scanner sc, int maxTries) {
        int counter = maxTries;
        while (counter-- > 0) {// you can also use `while(true)` if you 
                               // don't want to limit numbers of tries
            System.out.print("Please write number: ");
            if (sc.hasNextDouble()) {
                return sc.nextDouble();
            } else {
                String value = sc.next(); //consume invalid number
                System.out.printf(
                        "%s is not a valid number (you have %d tries left).%n",
                        value, counter);
            }
        }
        throw new NumberFormatException("Used didn't provide valid float in "
                + maxTries + " turns.");
    }
    

    那么你可以像这样使用这个方法

    Scanner keyboard = new Scanner(System.in);
    
    double i = getDouble(keyboard, 3);
    double j = getDouble(keyboard, 3);
    
    double answer = (j + i);
    System.out.println(answer);
    

    【讨论】:

      猜你喜欢
      • 2014-05-26
      • 2019-01-06
      • 1970-01-01
      • 2020-01-05
      • 1970-01-01
      • 2019-08-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多