当变量d1和d2不是正确的数据类型时,我总是得到默认的NumberFormatExctive消息。
当使用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());
}
}
}
这是输入值格式不正确时打印的消息示例。
输入一个数值:$Exception in thread“main”java。lang.NumberFormatException:用于java的输入字符串:“$”。base/jdk。内部的数学浮动小数。java上的readJavaFormatString(FloatingDecimal.java:2054)。base/jdk。内部的数学浮动小数。java上的parseDouble(FloatingDecimal.java:110)。base/java。朗,加倍。com上的parseDouble(Double.java:543)。实例JAVA主要的main(main.java:13)
代码的问题在于,在您尝试解析代码之后,您很好地进行了检查。
你的主要线索是你得到的堆栈跟踪。它清楚地表明异常是在第13行的parseDouble
处抛出的。这是在你自己做检查之前很久的事了,程序永远也达不到。
然后,您的下一步应该是检查Double的Javadoc。parseDouble
查看它返回什么以及何时抛出。
医生们读到(我漏掉了一些与问题无关的东西):
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
块中,如果失败,则重新显示自定义异常,如下所示:
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预先检查字符串。
我对投球的尝试/接球感到困惑。函数中有两个可能的IOExceptions。一,我想抓住并继续。另一个我想抛出一个异常让前面的函数处理。 如果IOException无法打开文件,我想捕获它,通知用户,然后继续。如果清除目录时出现IOException,我想抛出一个异常并在调用代码中处理它。
有人可以解释我什么时候使用关键字 throw new 有用.而不是在方法的签名旁边使用抛出? 我知道当方法抛出Checked Exception时。Java迫使我们通过将Exception处理到try-catch块中,或者通过在签名旁边的关键字throws指定将在其他地方完成,从而直接在方法中处理它。 然而,我很难理解何时使用关键字throw new是有用的,以及为什么。它与处理未选中的异常有关吗
无法弄清楚这是怎么回事-试图设置一个路由,只看到cxf连接到soap web服务(我不关心实际数据,也不期望数据实际“工作”,但它不断引发一个我不理解的异常: 我想知道我是否正确配置了它。我想这可能是一个丢失的jar,但当我尝试引入其他jar时,导致了依赖冲突 我正在使用maven依赖项“camel-cxf”来加载我所有的jar配置 “原因:org.apache.cxf.bus.extension
如果 Java 提供的内置异常类型不能满足程序设计的需求,这时我们可以自己设计 Java 类库或框架,其中包括异常类型。实现自定义异常类需要继承 Exception 类或其子类,如果自定义运行时异常类需继承 RuntimeException 类或其子类。 自定义异常的语法形式为: 在编码规范上,一般将自定义异常类的类名命名为 XXXException,其中 XXX 用来代表该异常的作用。 自定义异
我正在尝试使用Jackson将对象序列化到JSON,以便字段名基于一种类型的字段。 我有和这个线程中的OP一样的问题: 然而,这并不奏效。 我正在使用Wildfly 10.1 Final null CustomSerializer类: > 将注释添加到object字段,因此我的Response类现在如下所示: 当我测试它时,我得到了以下json对象: 现在,我尝试了本博客中的建议,并在我的Resp
如果我的代码中有一个try/cat块,是否需要在方法头后面有一个throws语句? 如果不是必需的,那么我什么时候/为什么需要使用throws?-这只是为了阻止编译器失败吗?(也就是说,我告诉它,我期待着一个错误,这没关系)