我有一个抛出MalformedURLException的方法。我用try-catch捕获了异常。
但是,它没有跳转到MalformedURLException,而是跳转到EJBException

try {
    myMethod(); // throws an exception
} catch (WebApplicationException ex) {
    ex.printStackTrace();
} catch (MalformedURLException ex) {
    ex.printStackTrace(); // I expected the debugger to jump to that line
} catch (EJBException ex) {
    ex.printStackTrace(); // debugger jumps to this line
} catch (Exception ex) {
    ex.printStackTrace();
}


堆栈跟踪:

WARNING:   A system exception occurred during an invocation on EJB MyClass, method: public com.name.AnotherClass com.name.MyClass.myMethod(java.lang.String,java.lang.String) throws java.net.MalformedURLException
WARNING:   javax.ejb.EJBException
    [...] // much more text...
Caused by: javax.ws.rs.WebApplicationException: HTTP 400 Bad Request
    [...] // much more text...
FATAL:   javax.ejb.EJBException
    [...] // much more text...
Caused by: javax.ws.rs.WebApplicationException: HTTP 400 Bad Request
    [...] // much more text...


作为stated here


  如果第一个catch匹配异常,则执行,否则,执行
  尝试下一个,然后一直不断,直到匹配或不匹配为止。


在我的示例中,首先触发MalformedURLException,如第一行所示:

throws java.net.MalformedURLException


只有第二行说:

javax.ejb.EJBException


那么,如果首先触发EJBException,为什么它立即跳到MalformedURLException

最佳答案

检查EJBException的ex.getCause()。 MalformedURLException由EJB容器的魔术包装。

一个人可能会想像一个

try { ...
} catch (Exception ex) {
    throw new EJBException(ex); // Cause: ex.
}

10-01 05:47