错误原因:0.9.4-beta1这个版本的net.semanticmetadata.lire.indexing.hashing包下缺少一个名为LshBitSampling.obj的文件
本人利用Maven导入Lire框架,可是Maven Repository中唯一的一个版本是0.9.4-kzwang-beta1(点击打开链接)
在做测试的时候报出了一个初始化错误:
Exception in thread "main" java.lang.ExceptionInInitializerError
at net.semanticmetadata.lire.DocumentBuilderFactory.getDefaultDocumentBuilder(DocumentBuilderFactory.java:67)
Caused by: java.lang.NullPointerException
at java.util.zip.InflaterInputStream.<init>(Unknown Source)
at java.util.zip.GZIPInputStream.<init>(Unknown Source)
at java.util.zip.GZIPInputStream.<init>(Unknown Source)
at net.semanticmetadata.lire.indexing.hashing.BitSampling.readHashFunctions(BitSampling.java:148)
at net.semanticmetadata.lire.impl.GenericDocumentBuilder.<clinit>(GenericDocumentBuilder.java:89)
... 2 more
错误显示DocumentBuilder工厂在初始化DocumentBuilder时出错
我从“at net.semanticmetadata.lire.impl.GenericDocumentBuilder.<clinit>(GenericDocumentBuilder.java:89)”这个地方开始一层层往上寻找错误
直到最后一层“at java.util.zip.InflaterInputStream.<init>(Unknown Source)”,我看了源码是这样的:
public InflaterInputStream(InputStream in, Inflater inf, int size) {
super(in);
if (in == null || inf == null) {
throw new NullPointerException();
} else if (size <= 0) {
throw new IllegalArgumentException("buffer size <= 0");
}
this.inf = inf;
buf = new byte[size];
}
从“if (in == null || inf == null) {
throw new NullPointerException();
}”这段代码可看出抛出空指针异常的原因是in或inf为空,但是inf在GZIPInputStream中通过new Inflater(true)创建,这个创建语句没有报错,说明inf不为空
所以抛出错误的原因就是in为空,这个in是在BitSampling.readHashFunctions方法中通过“BitSampling.class.getResourceAsStream(hashFunctionsFileName)”来创建的
hashFunctionsFileName的值为LshBitSampling.obj。
到这,我突然想到了点什么。(至于是什么我也不明白,反正我就很自然的做出下面的动作。。。。)
于是我就去找之前可以成功运行lire框架的项目,该项目的Lire框架版本为0.9.4-beta2。
我一层层打开,直到我打开net.semanticmetadata.lire.indexing.hashing包时,一切的错误都解决了,因为我新项目导入的0.9.4-beta1的
net.semanticmetadata.lire.indexing.hashing包下没有LshBitSampling.obj文件,而以前的项目中有此文件。