getResourceAsStream在它工作后返回null
我正在从一个servlet容器运行一个应用程序。这个应用程序产生的字母是从一些文件模板派生的jar。我通过Class.getResourceAsStrem
获得了这些文件,该应用程序完美无缺。getResourceAsStream在它工作后返回null
但是,经过数千次调用后,方法突然返回null
并继续返回null
,直到应用程序重新启动。我对此没有任何解释,我也看不出这会突然发生的原因。
我首先想到这可能是因为指向相同资源的未封闭流,但是我打开打开它后立即将流处理封装在一个catch
- try
-block中。此外,堆转储不显示这样的流对象,我还认为这应该导致IOException
,而不是。此外,它说在Javadoc
为InputStream对象或null如果与此名称的资源被发现
但为什么会应用突然不再能够找到资源之前,成功地找到。
任何想法?
我想我找到了原因。 ClassLoader.getResourceAsStream(String)
到Class.getResourceAsStream
最终委托实现这样的:
public InputStream getResourceAsStream(String name) {
URL url = getResource(name);
try {
return url != null ? url.openStream() : null;
} catch (IOException e) {
return null;
}
}
我想有一个IOException
发生,并且确有漏水打开的文件。然而,这个异常被吞噬,我得到一个返回的指针。 Genius API ...
更新:在查看堆转储后,我发现应用程序代码泄露文件。该死的你,ClassLoader
执行,误导我NullPointerException
s。
'看过堆转储......“ - 你是怎么得到的? – MyTitle
我发现'OutputStream'的实例躺在没有关闭但应该是堆的堆上。 (使用JVisualVM:http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html)我跟踪了这些实例,发现一个流被关闭了两次,而另一个流从未关闭。典型的复制粘贴,我假设。 –
这些文件在哪里? –
在jar的子文件夹中。 –