通过错误检查获取 Scanner 输入的更简洁的方法?

More succinct way to get Scanner input with error checking?

只是想知道是否有更好的方法来做这件事,因为它写了很多。

boolean isInputValid = false;
do {
    System.out.print("Input: ");
    final String input = sc.nextLine();

    try {
        age = Integer.parseInt(input);
    } catch (NumberFormatException e) {
        System.out.println("Invalid input. Try again");
        continue;
    }

    if (input < 0 || 10 < input) {
        System.out.println("Number outside of range.");
    } else {
        isInputValid = true;
    }
} while (!isInputValid);

好吧,有些东西乍一看可以省略,但没有太多要删除的。

  • 减少单行中的整数解析并删除 input 变量。
  • isInputValid 更改为其否定 isInputInvalid 以删除 while 子句中的 else 、布尔赋值和否定。
  • if 移到 try 子句中以增加冗余并删除 continue 语句。
boolean isInputInvalid = true;
do {
    System.out.print("Input: ");
    try {
        age = Integer.parseInt(  sc.nextLine());
        isInputInvalid = input < 0 || 10 < input;
        if (isInputInvalid) {
           System.out.println("Number outside of range.");
        } 
    } catch (NumberFormatException e) {
        System.out.println("Invalid input. Try again");
    }
  
} while (isInputInvalid);

好吧,乍一看,我可以看出您正在将不正确的字符串变量类型与整数(您的输入变量)进行比较,我假设您是想比较年龄。您还应该将 if 语句放在 try/catch 中,以确保按预期进行处理(如果抛出 NFE,将它放在 try/catch 之外也没有意义,它不会得到 运行 无论如何)。

boolean isInputValid = true;
do {
            System.out.print("Input: ");
            final String input = sc.nextLine();

            try {
                age = Integer.parseInt(input);

                if (age < 0 || 10 < age) {
                    System.out.println("Number outside of range.");
                    isInputValid = false;
                }
            } catch (NumberFormatException e) {
                System.out.println("Invalid input. Try again");
                continue;
            }
        } while (isInputValid);