Java Exception句柄案例

时间:2014-08-13 04:34:35

标签: java exception throwable

public void backendExecute(Map appParams, BackendTaskMetaData metaData) throws Throwable {
    try {
        PeriodicTaskData ptd = (PeriodicTaskData) appParams.get(PeriodicTaskData.PARAM_KEY);
        String bizKey = ptd.getBusinessKey();
    } catch (Exception e) {
        LogServices.app.error("RPTPeriodicReportGenTask:"+ e.getMessage());
    }
}

关于上面的方法,如果指向的对象是null,会遇到NullPointerException,我想知道是否会将这个异常捕获或抛出给调用者方法?感谢

5 个答案:

答案 0 :(得分:1)

ExceptionNullPointerException的父类,所以它会捕获它而不是将其抛给调用方法。

答案 1 :(得分:1)

当你捕获Exception类并且NullPointerException是它的子类时,异常将被捕获而不被抛出。

答案 2 :(得分:0)

catch (Exception e)

表示这将捕获任何异常(即Exception的任何子类)抛出前面的try块 - 其中,是的,包括NullPointerException。请注意,这通常被认为是一种不好的做法,因为您几乎总是希望以不同的方式处理不同类型的异常,因此需要多个catch语句。

例如,考虑一个可能在编译时抛出IllegalAccessException或在运行时抛出NullPointerException的方法 - 很难想象你想以同样的方式处理它们的情况,所以你通常想做这样的事情:

try {
    PeriodicTaskData ptd = (PeriodicTaskData) appParams.get(PeriodicTaskData.PARAM_KEY);
    String bizKey = ptd.getBusinessKey();
} catch (NullPointerException e) {
    //do something
} catch (IllegalAccessException e) { //for example... 
    //do something different
}

答案 3 :(得分:0)

NullPointerExceptionException的子类,因此会被捕获,但是建议您不要尝试捕获运行时异常。最好避免它们。

例如,可以通过执行以下操作来避免空指针:

if(ptd != null) {
    ptd.getBusinessKey();
} else {
    //Notify the user in some way or do something else.
}

答案 4 :(得分:0)

  

关于上述方法,如果对象ptd为null,则会遇到nullpointexception,

  

我想知道这个异常是catch还是把它扔给调用方法?

处理程序会捕获异常。处理程序将捕获Exception以及从中产生的任何异常。 NullPointerExceptionRuntimeException的子类,它(反过来)是Exception的子类。因此,它将被捕获。


现在,如果这只是一个说明性的例子......但是坏主意要:

  • 将方法声明为throws Throwable
  • catch Exception ...除非您即将终止该申请。

将方法声明为抛出Throwable使得调用者几乎无法知道可能会抛出哪些异常。相反,编译器会坚持让调用者捕获......或传播Throwable

捕获Exception有一个问题,即您将捕获 Exception的每个子类型...包括1)您不期望的各种未经检查的异常,以及2)是可能是安全从中恢复的错误症状。