首页 > 解决方案 > 在 Java 输入中捕获非 Double

问题描述

我正在尝试验证用户输入的学校作业,其中负数或除双精度外的任何内容都会导致循环重试。其余代码对输入进行了一些简单的算术运算,这些都是功能性的,所以我没有包含它,但这是我到目前为止的输入验证。现在输入一个负数可以做我想做的事情,但是输入一个不同的字符会导致无限循环

“无效的

输入墙高(英尺):"

当负数异常按预期工作时,为什么 !scnr.hasNextDouble() 不抛出异常,为什么它会无限重复?我非常感谢我能得到的任何帮助,谢谢。

public static void main(String[] args) {
    Scanner scnr = new Scanner(System.in);
    double wallHeight = 0.0;
    double wallWidth = 0.0;
    double wallArea = 0.0;
    double gallonsPaintNeeded = 0.0;

    final double squareFeetPerGallons = 350.0;


    // Implement a do-while loop to ensure input is valid  

    do {
        try {
            System.out.println("Enter wall height (feet): ");
            wallHeight = scnr.nextDouble();
            if (wallHeight <= 0) {
                throw new Exception("Enter positive number");
            }
            else if (!scnr.hasNextDouble()) {
                throw new Exception("Invalid input.");
            }
            }
        catch(Exception excpt){
            System.out.println(excpt.getMessage());
        }
        }while(wallHeight <= 0 || !scnr.hasNextDouble());

标签: javavalidationtry-catchdo-while

解决方案


您需要确保输入是双精度而不是字符串或整数。翻转 if 和 else-if 的顺序,首先检查输入是否为偶数,然后才检查是否为负数。

或者,您可以使用正则表达式来验证您的输入。下面的正则表达式检查 0 到 9 之间的任何数字,后跟一个句点和另一个从 0 到 9 的数字。请注意,它也适用于多个数字。

^[0-9]+\.[0-9]+$

只需使用 aString.matches(regex)来验证您的输入。

如果您想澄清每个符号的作用:^表示一行的开头,这意味着它之前不会出现任何内容。同样,$表示一行的结束,意味着后面不会有任何内容。

[0-9]是有效字符的范围,在本例中为 0 到 9 。

+表示可以有多个这些字符(多位数字)。

然后我们有句号,伴随着一个转义字符\,因为正.则表达式中的 a 表示“任何字符”,因此我们必须对其进行转义。

如果您想玩并了解更多关于 Regex 的信息,我建议您访问此站点


推荐阅读