1

このコード例では、aNullPointerExceptionが 4 行目にスローされています。

1. private <O,T> void generate(Suggestion suggestion, GeneratorFactory<O, T> generatorFactory) {
2.     final Generator<O, T> generator = generatorFactory.getGenerator(suggestion);
3.     while (generator.hasNext()) {
4.         generator.doGenerate();
5.     }
6.     // post-generate stuff here
7. }

たまにしか発生しませんが、ライブサーバーで数回発生しているため、何らかの「ゴースト」バグではなく、修正が必要です.


スタックトレース:

java.lang.NullPointerException
    at package.SuggestionServiceImpl.generate(SuggestionServiceImpl.java:4)

GeneratoryFactory のコード:

@Override
public synchronized Generator<O, T> getGenerator(final Suggestion suggestion) {
    Generator<O, T> generator = generators.get(suggestion.getId());
    if (generator == null) {
        generator = construct(suggestion); // calls `new Generator()`
        generators.put(suggestion.getId(), generator);
    }
    return generator;
}

私は混乱しています:

  • 3 行目の 'if' ステートメントで NPE が取得されないのはgeneratorなぜですか? それが null の場合?
  • スタック トレースが 4 行目から開始さdoGenerate()れるのはなぜですか。( の内部doGenerate()は長く複雑です。NPE がここから開始される可能性がありますが、スタック トレースがないのはなぜですか?)

アップデート:

実験的なテストとして、doGenerate()スタック トレースとミステリー ライブ トレースを比較するために、[開発環境で] 内部に意図的に NPE を投入しました。確かに、予想される追加のスタック フレームがあります。

java.lang.NullPointerException: DELIBERATE TEST EXCEPTION
    at package.Generator.doGenerate(Generator.java:71)
    at package.SuggestionServiceImpl.generate(SuggestionServiceImpl.java:4)

ランタイム JVM は次のとおりです。

java version "1.6.0_26"
Java(TM) SE Runtime Environment (build 1.6.0_26-b03)
Oracle JRockit(R) (build R28.1.4-7-144370-1.6.0_26-20110617-2130-linux-x86_64, compiled mode)
4

2 に答える 2