当变量d1和d2的数据类型不正确时,我总是会收到默认的NumberFormatException消息。
当我使用throw语句条件语句捕获那些异常时,我想打印我的自定义Exception消息。
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());
}
}
}
这是输入的值格式不正确时打印的消息的示例。
输入一个数值:$ 线程“主”中的异常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)
答案 0 :(得分:4)
您的代码存在的问题是,您已经尝试对它进行了解析,因此可以很好地进行检查。
您的主要线索是获得的堆栈跟踪。它清楚地表明在第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.
这意味着,如果使用此方法解析双打,则将抛出无效输入。
下一步要做什么取决于您的目标。引发异常的两个主要问题是:
-您需要自定义例外,而不是默认例外
-您要避免额外的异常(以免生成堆栈跟踪等)
如果您属于第一类,那么解决方案很简单-将parseDouble
放入try
块中,如果失败则重新抛出自定义异常,如下所示:
double d1;
try {
d1 = Double.parseDouble(input1);
catch (NumberFormatException | NullPointerException e) {
throw new MyCustomException("Please enter a valid double!", e);
}
如果执行此操作,则无需在try / switch块中再次检查(您已经保证输入是有效类型!)
如果您想完全避免使用NumberFormatException
,那么最好的选择是遵循Javadoc上的建议并在尝试解析之前使用rege预先检查字符串。