В этом примере коде NullPointerException
выбрасывают на линии 4.невыполнима NPE бросают (Java)
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;
}
Я запутался:
- Почему мы не получаем NPE в инструкции «if» в строке 3, если это
generator
, что равно нулю? - Почему трассировка стека начинается с строки 4, а не из строки внутри
doGenerate()
, если это откуда исходит исключение? (ВнутренностиdoGenerate()
являются длительными и сложными - возможно, что NPE начинается здесь, но почему нет трассировки стека?)
Update:
В качестве экспериментального теста, я намеренно бросил NPE внутри doGenerate()
[в среде Dev], чтобы сравнить трассировку стека с тайной живой. У этого действительно есть ожидаемая дополнительная рамка стека.
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)
Не могли бы вы добавить несколько элементов в стек? –
Может возникнуть ошибка ** внутри ** метода 'doGenerate()'. – Dariusz
отправьте метод stacktrace и doGenerate(). – Sikorski