在Java输入中捕获非Double类型

问题描述 投票:-2回答:1

我正在尝试验证学校作业的用户输入,其中负数或双精度数以外的任何数字都会导致循环重试。其余代码对输入执行一些简单的算术运算,并且全部功能正常,因此我没有包括它,但这是到目前为止的输入验证。现在输入负数可以完成我想要的操作,但是输入一个不同的字符会导致

的无限循环

“ null

输入壁高(英尺):“

为什么不抛出!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());
java validation try-catch do-while
1个回答
0
投票

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

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

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

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

[如果您想弄清楚每个符号的作用:^表示一行的开始,表示在它之前没有任何内容。同样,$表示一行的结尾,这意味着在其后将无任何内容。

[0-9]是有效字符的范围,在这种情况下,为0到9。

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

然后我们有句号,并带有转义字符\,因为在正则表达式中,.本身表示“任何字符”,因此我们必须对其进行转义。

如果您想更多地玩和了解Regex,建议您访问this site

© www.soinside.com 2019 - 2024. All rights reserved.