我正在尝试验证学校作业的用户输入,其中负数或双精度数以外的任何数字都会导致循环重试。其余代码对输入执行一些简单的算术运算,并且全部功能正常,因此我没有包括它,但这是到目前为止的输入验证。现在输入负数可以完成我想要的操作,但是输入一个不同的字符会导致
的无限循环“ 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());
您需要确保输入为双精度而不是字符串或整数。翻转if和else-if的顺序,首先检查输入是否为双精度,然后再检查输入是否为负。
或者,您可以使用Regex来验证输入。下面的正则表达式检查0到9之间的任何数字,后跟一个句点,以及0到9之间的另一个数字。请注意,它也适用于多个数字。
^[0-9]+\.[0-9]+$
只需使用String.matches(regex)
来验证您的输入。
[如果您想弄清楚每个符号的作用:^
表示一行的开始,表示在它之前没有任何内容。同样,$
表示一行的结尾,这意味着在其后将无任何内容。
[0-9]
是有效字符的范围,在这种情况下,为0到9。
+
表示这些字符中可以有多个(多个数字)。
然后我们有句号,并带有转义字符\
,因为在正则表达式中,.
本身表示“任何字符”,因此我们必须对其进行转义。
如果您想更多地玩和了解Regex,建议您访问this site。