我想修改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类吗?



为什么不触发扩展ExtenderClassArithmeticException类?但是当我直接使用ArithmeticException时,它会被解雇。

最佳答案

虽然已将自定义异常声明为ArithmeticException的子类,但您无法获得a / b引发自定义异常。 JLS指定(整数)除以零将抛出ArithmeticException;参见JLS 15.17.2第3段。

由于抛出的异常是ArithmeticException,因此您将无法捕获它作为自定义异常。

try {
   c = a / b;
} catch (ExtenderClass ex) {
   ...
}


将捕获ExtenderClassExtenderClass的子类。 ArithmeticException不是ExtenderClass的子类,因此上述内容无法捕获。



您创建ExtenderClass的原因是...


我想修改ArithmeticException输出消息。


您最好编写一些特殊情况的代码,以在打印出来时用不同的消息替换“ / zero”消息。

要么 ....

try {
   c = a / b;
} catch (ArithmeticException ex) {
   thrown new ExtenderClass("Division by zero is cool!, ex);
}

10-07 20:14