如果提供了无效费率(包括信件),我正在尝试继续提示用户提供有效的付款。问题是如果我输入一个字母而不是一个数字,那么我会无休止地得到"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;
}
}
答案 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();
}