我正在从servlet容器运行一个应用程序。此应用程序生成的字母派生自一些随jar打包的文件模板。我通过Class.getResourceAsStrem
获取这些文件,应用程序运行正常。
但是,经过数千次调用后,该方法突然返回null
并继续返回null
,直到重新启动应用程序。我对此没有任何解释,我也看不出为什么会突然发生这种情况。
我首先想到这可能是因为未关闭的流指向同一个资源,但我在打开它后立即将流处理包装在catch
- try
- 块中。此外,堆转储不显示此类流对象,我还认为这应该导致IOException
。此外,它在javadoc
一个InputStream对象,如果没有找到具有此名称的资源,则返回null
但为什么应用程序突然无法再找到之前成功找到的资源。
有什么想法吗?
答案 0 :(得分:1)
我想我找到了原因。 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
正在发生,确实有泄漏的打开文件。然而,这个异常被吞下,我得到一个null
指针作为回报。 Genius API ......
更新:查看堆转储后,我发现泄漏文件的应用程序代码。该死的,ClassLoader
实施,误导我NullPointerException
s。