在此示例代码NullPointerException
中,第 4 行抛出了 a。
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
是空的? - 为什么堆栈跟踪从第 4 行开始,而不是从内部的一行开始,
doGenerate()
如果那是异常的来源?(内部doGenerate()
结构冗长而复杂——NPE 可能从这里开始,但为什么没有堆栈跟踪?)
更新:
作为实验测试,我特意在doGenerate()
[in dev environment] 中扔了一个 NPE,以将堆栈跟踪与神秘的 live 进行比较。它确实具有预期的额外堆栈帧。
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)