检查输入以查看它是否是Java中的双精度数

时间:2017-10-08 23:25:29

标签: java exception-handling

我正在创建代码,要求输入2个数字,然后将它们加起来/ multipies / divides。我设法让这个工作,但我遇到了一个小问题。

这是困扰我的代码的一部分:

double number1 = 0;
do {
    try {
        System.out.print("First number: ");
        number1 = input.nextDouble();
    } catch (InputMismatchException e) {
        System.out.print("This is not a number. ");
    }
    input.nextLine();
} while (number1 == 0);

它适用于我打算做的事情,这是要求一个数字。如果用户没有输入数字,它会捕获异常并阻止它退出。

while (number1 == 0);

这是我用来测试try和catch是否按预期工作,但当然意味着number1不能为0或者它不会停止并继续要求输入数字。

我希望它只要输入一个double就继续询问输入,我该替换什么?

因为这是一个分配,我必须继续要求 double ,如果最好不要使用异常,那是可以接受的。但它必须为number1分配一个号码,我稍后可以在程序中使用

2 个答案:

答案 0 :(得分:1)

首先,以下是如何修改代码以使其正常工作 - 您可以添加boolean标志以指示循环已成功:

double number1 = 0;
boolean success;
do {
    success = true;
    try {
        System.out.print("First number: ");
        number1 = input.nextDouble();
    } catch (InputMismatchException e) {
        System.out.print("This is not a number. ");
        success = false;
    }
    input.nextLine();
} while (!success);

接下来,应该重新编写代码以避免在调用hasNextDouble之前调用nextDouble来捕获异常:

double number1 = 0;
while(true) {
    System.out.print("First number: ");
    if (input.hasNextDouble()) {
        number1 = input.nextDouble(); // This will not throw an exception
        break;
    }
    System.out.print("This is not a number. ");
    input.nextLine();        
}

答案 1 :(得分:0)

如果您可以捕获异常,则可以使用parseDouble类提供的Double函数。

实现此目的的简单代码片段是

public class AcceptDouble {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        double number1 = 0;

        while(true){
            try {
                number1 = Double.parseDouble(sc.next());
                System.out.println("Got: " + number1);
                // DO WHAT YOU WANT WITH NUMBER1
            }
            catch (NumberFormatException timeToBreak) {
                System.out.println("Time to break");
                break;
            }
        }
    }
}

只要输入有效数字,就会继续接受新输入。附加参考的示例输出片段

34
Got: 34.0
23
Got: 23.0
12
Got: 12.0
end
Time to break