遇到异常时麻烦继续循环

时间:2014-01-10 18:52:54

标签: java exception-handling while-loop

如果提供了无效费率(包括信件),我正在尝试继续提示用户提供有效的付款。问题是如果我输入一个字母而不是一个数字,那么我会无休止地得到"Payrate must be > 0"消息;但是,如果我输入0或负数,我会按预期提示。

我做错了什么以及如何解决这个问题?

while (payrate <= 0) {
    try {
        System.out.print("Enter payrate: "); //ask for payrate
        payrate = input.nextFloat();  //store input from console
    } catch (Exception InputMismatchException) {
        System.out.println("Payrate must be > 0.");
        payrate = 0;
    }
}

6 个答案:

答案 0 :(得分:4)

您可以在异常中使用input.next(),因为.nextFloat()未清除无效值。

答案 1 :(得分:2)

使用BufferReader而不是Scanner。

BufferedReader bufferRead = new BufferedReader(new InputStreamReader(System.in));

Float s = Float.parseFloat(bufferRead.readLine());

所以你不会得到那个痛点...

答案 2 :(得分:2)

问题是如果发生异常,Scanner类不会清除输入,所以如果输入了一个字母,它会继续给自己输入一个字母。

此外,payrate变量不需要用于循环控制。

鉴于上述情况,一个简单的替代方案是:

String value;

while (true) { // Repeat until a valid payrate is entered
    try {
        System.out.print("Enter payrate: "); // Ask for payrate

        value = input.nextLine();            // Get payrate as string
        payrate = Float.parseFloat(value);   // Convert the string to float

        if (payrate > 0) { // Valid payrate number (> 0), done
            break;
        } else {           // Invalid payrate number (<= 0), repeat
            System.out.println("Payrate must be > 0.");
        }
    } catch (NumberFormatException e) { // Payrate not a number, repeat
        System.out.println("Payrate must be a number.");
    }
}

答案 3 :(得分:1)

你可以试试这个:

while (payrate <= 0) {
    try {
        System.out.print("Enter payrate: "); //ask for payrate
        payrate = Float.parseFLoat(input.next()); //Converts string to float
    } catch (NumberFormatException nfe) {  //I changed the exception catched
        System.out.println("Invalid number! Payrate must be > 0.");
        payrate = 0;
    }
}

答案 4 :(得分:1)

你知道nextFloat()接受或扫描下一个浮点值,当你没有转换为有效的浮点值时,这些方法抛出异常InputMissmatchException,当你尝试输入字符串或字符时,你不能识别输入的值是浮动还是不浮动,

请记住,当您声明float变量并指定任何浮点值时,必须将“f”结尾写入该值。 试试10.10f

答案 5 :(得分:1)

要接近已经完成的工作,因为异常被捕获到无效内容,我们可以清除错误输入的扫描程序。 input.nextLine()将读取无效输入。没有对捕获的值做任何事情都会忽略它。

<强>解决方案: 只需在catch块中添加input.nextLine();

即可
           try {
                System.out.print("Enter payrate: "); //ask for payratea
                payrate = input.nextFloat();  //store input from console
            } catch (Exception InputMismatchException) {
                System.out.println("Payrate must be > 0.");
                payrate = 0;
                input.nextLine();
            }