gpt4 book ai didi

java - Java 中的自定义异常 Try Throw Catch

转载 作者:行者123 更新时间:2023-12-01 16:43:31 27 4
gpt4 key购买 nike

当变量 d1 和 d2 的数据类型不正确时,我总是收到默认的 NumberFormatException 消息。

当使用 throw 语句条件捕获这些异常时,我想打印我的自定义异常消息。

public static void main(String[] args) {

Scanner sc = new Scanner(System.in);

System.out.print("Enter a numeric value: ");
String input1 = sc.nextLine();
Double d1 = Double.parseDouble(input1);
System.out.print("Enter a numeric value: ");
String input2 = sc.nextLine();
Double d2 = Double.parseDouble(input2);
System.out.print("Choose an operation (+ - * /): ");
String input3 = sc.nextLine();
try {
if (!(d1 instanceof Double)) {
throw (new Exception("Number formatting exception caused by: "+d1));
}
if (!(d2 instanceof Double)) {
throw (new NumberFormatException("Number formatting exception caused by: "+d2));
}
switch (input3) {
case "+":
Double result = d1 + d2;
System.out.println("The answer is " + result);
break;
case "-":
Double result1 = d1 - d2;
System.out.println("The answer is " + result1);
break;
case "*":
Double result2 = d1 * d2;
System.out.println("The answer is " + result2);
break;
case "/":
Double result3 = d1 / d2;
System.out.println("The answer is " + result3);
break;
default:
System.out.println("Unrecognized Operation!");
break;
}
}
catch (Exception e){
System.out.println(e.getMessage());
}

}

}

这是输入值格式不正确时打印的消息示例。

输入数值:$线程“main”中的异常 java.lang.NumberFormatException:对于输入字符串:“$” 在 java.base/jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:2054) 在 java.base/jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110) 在 java.base/java.lang.Double.parseDouble(Double.java:543) 在 com.example.java.Main.main(Main.java:13)

最佳答案

您的代码的问题在于您在尝试解析它之后才进行检查。

您的主要线索是您获得的堆栈跟踪。它清楚地表明异常是在第 13 行的 parseDouble 处引发的。这早在您进行自己的检查之前,程序就永远不会到达它。

下一步应该检查 Double.parseDouble 的 Javadoc 以查看它返回什么以及何时抛出。

文档阅读(我遗漏了一些与问题无关的内容):

Returns a new double initialized to the value represented by the specified String

Throws:
NullPointerException - if the string is null
NumberFormatException - if the string does not contain a parsable double.

这意味着,如果您使用此方法来解析 double ,那么它抛出无效输入。

您接下来要做什么取决于您的目标是什么。抛出异常的两个主要问题是:
- 您想要自定义异常,而不是默认异常
- 你想避免额外的异常(以免生成堆栈跟踪等)

如果您属于第一类,那么解决方案很简单 - 将 parseDouble 放入 try block 中,如果失败则重新抛出自定义异常,如下所示:

double d1;
try {
d1 = Double.parseDouble(input1);
catch (NumberFormatException | NullPointerException e) {
throw new MyCustomException("Please enter a valid double!", e);
}

如果您这样做,则无需再次检查 try/switch block (您已经保证输入是有效类型!)

如果您想完全避免 NumberFormatException,那么最好的选择是遵循 Javadoc 上的建议。并在尝试解析之前使用 rege 预先检查字符串。

关于java - Java 中的自定义异常 Try Throw Catch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57835633/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com