我想修改ArithmeticException
输出消息。因此,为此我做了很少的实验。我通过ArithmeticException
类扩展了ExtenderClass
类。这个问题的重点不仅在于找到解决方案来修改ArithmeticException
异常消息,而且要说明为什么以下某些情况能按预期工作,而有些情况却没有?以下是案例及其输出:
情况1:
// Both the classes are in the same file 'MyClass.java'
class MyClass{
public static void main(String args[]){
int a,b,c;
a = 1;
b = 0;
try{
c = a / b;
}catch(ArithmeticException e){
System.out.println("I caught: " + e);
}
}
}
class ExtenderClass extends ArithmeticException{
// ...
}
输出:
I caught: java.lang.ArithmeticException: / by zero
结果:工作正常。
情况2:
// Both the classes are in the same file 'MyClass.java'
class MyClass{
public static void main(String args[]){
int a,b,c;
a = 1;
b = 0;
try{
c = a / b;
}catch(ExtenderClass e){
System.out.println("I caught: " + e);
}
}
}
class ExtenderClass extends ArithmeticException{
// ...
}
输出:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at MyClass.main(MyClass.java:9)
结果:表示未触发
throw/catch
。为什么不触发ExtenderClass
?实际上,它扩展了ArithmeticException
类吗?情况3:
// Both the classes are in the same file 'MyClass.java'
class MyClass{
public static void main(String args[]){
int a,b,c;
a = 1;
b = 0;
try{
c = a / b;
throw new ArithmeticException();
}catch(ArithmeticException e){
System.out.println("I caught: " + e);
}
}
}
class ExtenderClass extends ArithmeticException{
// ...
}
输出:
I caught: java.lang.ArithmeticException: / by zero
结果:工作正常。
情况4:
// Both the classes are in the same file 'MyClass.java'
class MyClass{
public static void main(String args[]){
int a,b,c;
a = 1;
b = 0;
try{
c = a / b;
throw new ExtenderClass();
}catch(ExtenderClass e){
System.out.println("I caught: " + e);
}
}
}
class ExtenderClass extends ArithmeticException{
// ...
}
输出:
Exception in thread "main" java.lang.ArithmeticException: / by zero
at MyClass.main(MyClass.java:9)
结果:表示未触发
throw/catch
。为什么不触发ExtenderClass
?实际上,它扩展了ArithmeticException
类吗?为什么不触发扩展
ExtenderClass
的ArithmeticException
类?但是当我直接使用ArithmeticException
时,它会被解雇。 最佳答案
虽然已将自定义异常声明为ArithmeticException
的子类,但您无法获得a / b
引发自定义异常。 JLS指定(整数)除以零将抛出ArithmeticException
;参见JLS 15.17.2第3段。
由于抛出的异常是ArithmeticException
,因此您将无法捕获它作为自定义异常。
try {
c = a / b;
} catch (ExtenderClass ex) {
...
}
将捕获
ExtenderClass
和ExtenderClass
的子类。 ArithmeticException
不是ExtenderClass
的子类,因此上述内容无法捕获。您创建
ExtenderClass
的原因是...我想修改
ArithmeticException
输出消息。您最好编写一些特殊情况的代码,以在打印出来时用不同的消息替换“ / zero”消息。
要么 ....
try {
c = a / b;
} catch (ArithmeticException ex) {
thrown new ExtenderClass("Division by zero is cool!, ex);
}