我可以简化这三个捕获块吗?

时间:2012-11-25 23:29:29

标签: java exception exception-handling

我可以以某种方式在方法

中使用这段代码
        if (!printStackTrace_printed) {
            ex.printStackTrace();
            printStackTrace_printed=true;
        }
        logStoreException(ex);
        throw new Exception(ex.getMessage());

并在每个catch块中调用它并将正确的参数传递给 ex npe

    catch (RationalTestException ex) {
        if (!printStackTrace_printed) {
            ex.printStackTrace();
            printStackTrace_printed=true;
        }
        logStoreException(ex);
        throw new Exception(ex.getMessage());

    } 
    catch (NullPointerException npe) {
        if (!printStackTrace_printed) {
            npe.printStackTrace();
            printStackTrace_printed=true;
        }
        logStoreException(npe);
        throw new Exception(npe.getMessage());

    }   
    catch (Exception ex) {
        if (!printStackTrace_printed) {
            ex.printStackTrace();
            printStackTrace_printed=true;
        }
        logStoreException(ex);
        throw new Exception(ex.getMessage());
    } 

2 个答案:

答案 0 :(得分:3)

由于您在最后一次捕获中捕获Exception,并且所有catch块都相同,因此您可以完全删除其他两个catch块而不会影响该程序。

它没有任何区别的原因是NullPointerExceptionException的子类,因此捕获Exception也会捕获NullPointerException以及引发的任何其他异常试试块。


请注意,一般情况下,捕获Exception被视为反模式,但服务器调用的最高级别除外。

答案 1 :(得分:0)

您只能输入其中一个catch块,而不是全部,所以您根本不需要'printStackTrace_printed'布尔值。一般情况下捕获一个异常并抛出另一个异常也是不好的做法,但如果你有理由这样做,你只需要捕获异常,而不是其他两个。所以你的问题大多消失了。