我可以在Java中实现链接的Exception设施为

情况1:

public static void main(String[] args) {

    try {
        method1();
    } catch (Exception e) {
        System.out.println("Exception in the main method :: "+e);
    }

}

private static void method1() throws Exception {
    try{
        System.out.println("Inside Try Block"+10/0);
    } catch(ArithmeticException e){
        System.out.println("Exception in method1 :: "+e);
        throw e;
    } finally{
        System.out.println("In FinallY Block");
    }

}


情况2:

public static void main(String[] args) {

    try {
        method1();
    } catch (Exception e) {
        System.out.println("Exception in the main method :: "+e);
    }

}

private static void method1() throws Exception {
    try{
        System.out.println("Inside Try Block"+10/0);
    } catch(ArithmeticException e){
        System.out.println("Exception in method1 :: "+e);
        throw (ArithmeticException)new ArithmeticException().initCause(e);
    } finally{
        System.out.println("In FinallY Block");
    }
}


我得到的输出为

Exception in method1 :: java.lang.ArithmeticException: / by zero
In FinallY Block
Exception in the main method :: java.lang.ArithmeticException: / by zero


我的问题是:


这两种情况有什么区别吗?
哪个更好的方法?
为何2个案件出于相同目的?

最佳答案

区别在于,在第二种情况下,您将原始的ArithmeticException异常包装在另一个相同类型的异常中(请参见下面的说明,这是毫无意义的)。
案例1可能是您要在这里使用的,因为您没有将异常的含义扩展到更高的层次。
他们有不同的目的,让我解释一下...


如果将异常设置为原因,则它的含义不同。通过将ArithmeticException包装在更高级别的异常中,可以赋予它更大的含义。在这里,您只是将其包装在另一个ArithmeticException中,这没有任何意义。

例如,当您尝试从Web服务中获取某些数据时,可能是原因所在:发送HTTP请求的低级方法会抛出一些SocketExceptionHttpException,然后将它们包装在更高级别中描述无法加载哪些资源的异常(例如)。

10-05 22:44
查看更多