1 回答
TA贡献2036条经验 获得超8个赞
您不应该将 try-with-resource 与您自己没有打开的资源一起使用,尤其是 with ,System.in它永远不应该被应用程序关闭。
除此之外,您应该更喜欢事先测试条件,而不是捕获异常。此外,尽量避免代码重复,您最终会得到一个更简单的解决方案:
public static void main(String[] args) {
Scanner sc = new Scanner(System.in).useDelimiter("\\R");
System.out.print("Enter first numeric value: ");
double d1 = getDouble(sc);
System.out.print("Enter second numeric value: ");
double d2 = getDouble(sc);
System.out.print("Choose an operation (+ - * /): ");
while(!sc.hasNext("[-+*/]")) {
System.out.println(sc.next()+" is not a valid operation");
}
String operation = sc.next();
double result;
switch (operation) {
case "+": result = d1 + d2; break;
case "-": result = d1 - d2; break;
case "*": result = d1 * d2; break;
case "/": result = d1 / d2; break;
default:
throw new AssertionError("should not happen due to pretest");
}
System.out.println(d1+operation+d2);
System.out.println("The answer is " + result);
}
private static double getDouble(Scanner sc) {
while(!sc.hasNextDouble()) {
System.out.println(sc.next()+" is not a number");
}
return sc.nextDouble();
}
该解决方案用于hasNextDouble()询问扫描器下一个令牌是否具有双精度格式,并且只有在确认的情况下,应用程序才会通过 获取它nextDouble()。否则,它用于next()获取无效令牌,该令牌同时服务于报告并将其从未处理的输入中删除。同样,hasNext("[-+*/]")检查输入是否与支持的四个运算符之一匹配。
由于编译器不知道现在只能出现四个有效输入之一,因此我们必须在 的情况下放置一个抛出语句default,switch否则编译器会说result可能尚未初始化。我们可以初始化result为默认值,但如果程序流程未按预期工作,最好有一个强信号,而不是将默认值打印为错误结果。
使用Scanner可配置的分隔符来决定令牌的构成,因此该解决方案使用useDelimiter("\\R")换行符作为分隔符,将每一行视为一个令牌,就像原始代码一样。因此该类Pattern对语法进行了完整的描述。
添加回答
举报