getResourceAsStream在工作后返回null

时间:2013-11-27 20:14:55

标签: java resources

我正在从servlet容器运行一个应用程序。此应用程序生成的字母派生自一些随jar打包的文件模板。我通过Class.getResourceAsStrem获取这些文件,应用程序运行正常。

但是,经过数千次调用后,该方法突然返回null并继续返回null,直到重新启动应用程序。我对此没有任何解释,我也看不出为什么会突然发生这种情况。

我首先想到这可能是因为未关闭的流指向同一个资源,但我在打开它后立即将流处理包装在catch - try - 块中。此外,堆转储不显示此类流对象,我还认为这应该导致IOException。此外,它在javadoc

中说
  

一个InputStream对象,如果没有找到具有此名称的资源,则返回null

但为什么应用程序突然无法再找到之前成功找到的资源。

有什么想法吗?

1 个答案:

答案 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。