0
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,我想知道这个异常是否会被捕获或抛出给调用者方法?谢谢

4

5 回答 5

1

Exception是 的父类NullPointerException,所以它会捕获它而不是把它扔给调用方法。

于 2014-08-13T04:37:31.757 回答
1

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

于 2014-08-13T04:54:34.827 回答
0
catch (Exception e)

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

例如,考虑一个可能IllegalAccessException在编译时或NullPointerException运行时抛出 a 的方法 - 很难想象您希望以相同方式处理它们的情况,因此您通常希望执行以下操作:

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
}
于 2014-08-13T04:37:38.087 回答
0

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

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

if(ptd != null) {
    ptd.getBusinessKey();
} else {
    //Notify the user in some way or do something else.
}
于 2014-08-13T04:39:18.267 回答
0

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

是的。

我想知道这个异常会被捕获还是抛出给调用者方法?

异常将被处理程序捕获。处理程序将捕获Exception任何由它产生的异常。 NullPointerException是一个子类,RuntimeException它(又)是 的子类Exception。因此,它会被抓住。


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

  • 将方法声明为throws Throwable,或
  • catch Exception... 除非您要终止应用程序。

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

捕获Exception的问题是您将捕获... 的每个子类型,Exception包括各种未经检查的异常,这些异常 1) 您没有预料到,以及 2) 可能是您无法安全恢复的错误的症状。

于 2014-08-13T04:42:33.823 回答