java - 在 Java 输入中捕获非 Double
问题描述
我正在尝试验证用户输入的学校作业,其中负数或除双精度外的任何内容都会导致循环重试。其余代码对输入进行了一些简单的算术运算,这些都是功能性的,所以我没有包含它,但这是我到目前为止的输入验证。现在输入一个负数可以做我想做的事情,但是输入一个不同的字符会导致无限循环
“无效的
输入墙高(英尺):"
当负数异常按预期工作时,为什么 !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 的顺序,首先检查输入是否为偶数,然后才检查是否为负数。
或者,您可以使用正则表达式来验证您的输入。下面的正则表达式检查 0 到 9 之间的任何数字,后跟一个句点和另一个从 0 到 9 的数字。请注意,它也适用于多个数字。
^[0-9]+\.[0-9]+$
只需使用 aString.matches(regex)
来验证您的输入。
如果您想澄清每个符号的作用:^
表示一行的开头,这意味着它之前不会出现任何内容。同样,$
表示一行的结束,意味着后面不会有任何内容。
[0-9]
是有效字符的范围,在本例中为 0 到 9 。
+
表示可以有多个这些字符(多位数字)。
然后我们有句号,伴随着一个转义字符\
,因为正.
则表达式中的 a 表示“任何字符”,因此我们必须对其进行转义。
如果您想玩并了解更多关于 Regex 的信息,我建议您访问此站点。
推荐阅读
- javascript - 轮播滑块不更改图像
- c++ - 每次改变常数,结果都不一样
- mysql - XAMPP MySQL 访问被拒绝 ** 仅当未连接到 Internet 时**
- reflection - 从未知对象(.net)生成一个招摇文件
- node.js - Watson Assistant 日志错误“超出速率限制”
- python - 根据它们在另一个数据帧中的频率将值附加到一个数据帧
- angular - Angular 7 Http 客户端和 Asp Core - Cors 错误
- ios - 在 iOS 上无法捕捉从“倒置”到横向的方向变化
- r - 在另一个变量的基础上用其他变量创建新变量
- java - 如何将可以是简单字符串或对象的 JSON 元素解析为类对象