Java 使用工厂模式时的NullPointerException

Java 使用工厂模式时的NullPointerException,java,eclipse,debugging,factory-pattern,Java,Eclipse,Debugging,Factory Pattern,我在Java代码中使用工厂模式。工厂使用抽象的CSVHeader类。CSVHeader有一个抽象方法和几个具体方法。标头创建两个继承类之一(下面称为TypeOne和TypeTwoHeader)。这些类有自己版本的一个抽象方法 我试图使用Eclipse调试器,但我被难住了,因为调试器甚至没有到达getHeader()方法的第一行——调试器直接从调用类跳到NullPointerException类。以下是异常的输出: Eclipse java.lang.NullPointerException

我在Java代码中使用工厂模式。工厂使用抽象的CSVHeader类。CSVHeader有一个抽象方法和几个具体方法。标头创建两个继承类之一(下面称为TypeOne和TypeTwoHeader)。这些类有自己版本的一个抽象方法

我试图使用Eclipse调试器,但我被难住了,因为调试器甚至没有到达getHeader()方法的第一行——调试器直接从调用类跳到NullPointerException类。以下是异常的输出:

Eclipse java.lang.NullPointerException
    at com.company.package.StationWriter.<init>(StationWriter.java:98)
...
DeviceWriter(接口CSVWriter的具体实现)——这项工作:

new DeviceWriter(params) {
    ...
    CSVHeader headerWriter = new HeaderFactory().getHeader(params);
}
HeaderFactory(混凝土等级):


正如在评论中所发现的,问题是由于取消对null
Integer

的装箱导致的,参数的类型是什么?它可以是
null
?StationWriter。意思是站长constructor@oers如果
params
是某个已装箱的值,如
Long
getHeader
接受
Long
,那么将
params==null
取消装箱可能会导致第98行出现NPE。子采样周期的类型是什么,includeMetaDataHeader,includeMetaDataHeader,突破,改变。其中有一个分别是整数还是布尔值?(见胜利者对我的评论)@Victor Sorokin:我想就是这样。在原始代码中,subSample是一个int,但在后续代码中它被更改为Integer。这就解释了为什么它不起作用。现在它可以是空的;以前它只能是int值。Augh。没有达尔文原理的代码进化。:)因此,我要从中吸取的原则是,如果参数在将来的某个时候可能会作为一个空的装箱值传入,我应该在签名中使用装箱类型。@GLaDOS,更好的方法是有足够的单元测试来尽快捕获这些内容。True。我忽略了这方面的单元测试,因为测试中的组件集成了许多从数据库加载的数据缓存的对象。我很想找到一篇文章,帮助我学会将假数据加载到缓存中,这样我就不必使用db进行测试。@GLaDOS为此,第一点是尝试针对接口编写代码,这样您就可以将一些存根实现传递给正在测试的代码。第二点,如果您需要将某些第三方类型传递给正在测试的代码,而该类型不是接口,您可以尝试
Mockito
或类似的单元测试框架。莫基托对这种事情很酷。
new DeviceWriter(params) {
    ...
    CSVHeader headerWriter = new HeaderFactory().getHeader(params);
}
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;
}