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

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

上記のメソッドに関して、オブジェクト ptd が null の場合、nullpointexception が発生します。

はい。

この例外がキャッチまたは呼び出し元メソッドにスローされることを知りたいですか?

例外はハンドラーによってキャッチされます。ハンドラーはException、それから派生したすべての例外をキャッチします。 NullPointerExceptionは のサブクラスでRuntimeExceptionあり、(順番に) のサブクラスですException。したがって、それはキャッチされます。


さて、これが単なる例であるとすれば...しかし、次のことは悪い考えです:

  • メソッドをthrows Throwable、または
  • catch Exception... アプリケーションを終了しようとしている場合を除きます。

メソッドをスローとして宣言すると、呼び出し元がどの例外スローされる可能性があるThrowableかを知ることがほぼ不可能になります。代わりに、コンパイラは、呼び出し元が ... をキャッチするか、伝播することを主張します。Throwable

キャッチには、さまざまな未チェックの例外を含む ... のすべてのサブタイプをExceptionキャッチするという問題があります。これらは、1) 予期していないものであり、2) おそらく安全に回復できないバグの症状です。Exception

于 2014-08-13T04:42:33.823 に答える
0
catch (Exception e)

これは、前のブロック内でスローされた例外 (つまり、 のサブクラス)をキャッチすることを意味します。ほとんどの場合、さまざまな種類の例外をさまざまな方法で処理する必要があるため、これは一般的に悪い習慣と見なされることに注意してください。したがって、複数のステートメントが必要になります。ExceptiontryNullPointerExceptioncatch

たとえば、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
}
于 2014-08-13T04:37:38.087 に答える