NullPointerException при использовании фабричного шаблона - PullRequest
2 голосов
/ 20 марта 2012

Я использую шаблон Factory в своем коде Java. Фабрика использует абстрактный класс CSVHeader. CSVHeader имеет один абстрактный и несколько конкретных методов. Заголовок создает один из двух наследуемых классов (ниже называются TypeOne и TypeTwoHeader). Эти классы имеют свою собственную версию одного абстрактного метода.

Я пытаюсь использовать отладчик Eclipse, но я в тупике, потому что отладчик даже не попадает на первую строку в методе getHeader () - отладчик переходит прямо из вызывающего класса в класс NullPointerException. Вот вывод из исключения:

Eclipse java.lang.NullPointerException
    at com.company.package.StationWriter.<init>(StationWriter.java:98)
...

Мне интересно, видел ли кто-нибудь еще такое поведение в Eclipse или при использовании фабричного шаблона в Java? Угловые скобки вокруг <init> подразумевают, что это проблема с тем, как я использую или не использую Generics? Я использую Eclipse Indigo Service Release 1 Идентификатор сборки: 20110916-0149. Вот еще о моей реализации:

Метод getHeader () из HeaderFactory возвращает один из подклассов, которые наследуются от CSVHeader; какой подкласс возвращается, зависит от входных переменных. У этого метода никогда не было проблем, и он все еще работает. Он прерывается только когда я вызываю его из класса StationWriter, который вызывает его точно так же, только с разными аргументами. Аргументы никогда не читаются, потому что код переходит прямо в NullPointerException, прежде чем он даже входит в тело метода getHeader ().

StationWriter (конкретная реализация интерфейса CSVWriter) - это показывает строку 98 и не работает:

new StationWriter(params) {
   ...
   CSVHeader headerWriter = new HeaderFactory().getHeader(params);
}

DeviceWriter (конкретная реализация интерфейса CSVWriter) - это работает:

new DeviceWriter(params) {
    ...
    CSVHeader headerWriter = new HeaderFactory().getHeader(params);
}

HeaderFactory (конкретный класс):

public CSVHeader getHeader(params) {
   //when debugging in StationWriter it doesn't even get to this point. 
   CSVHeader header; 
   if (something == true) {
       header = new TypeOneHeader(params);
    } else {
       header = new TypeTwoHeader(params);
    }
    return header;
} 

1 Ответ

1 голос
/ 20 марта 2012

Как выяснилось в комментариях, проблема была вызвана распаковкой нулевого значения Integer.

...