2013-11-27 68 views
1

我正在从一个servlet容器运行一个应用程序。这个应用程序产生的字母是从一些文件模板派生的jar。我通过Class.getResourceAsStrem获得了这些文件,该应用程序完美无缺。getResourceAsStream在它工作后返回null

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

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

为InputStream对象或null如果与此名称的资源被发现

但为什么会应用突然不再能够找到资源之前,成功地找到。

任何想法?

+0

这些文件在哪里? –

+0

在jar的子文件夹中。 –

回答

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发生,并且确有漏水打开的文件。然而,这个异常被吞噬,我得到一个返回的指针。 Genius API ...

更新:在查看堆转储后,我发现应用程序代码泄露文件。该死的你,ClassLoader执行,误导我NullPointerException s。

+0

'看过堆转储......“ - 你是怎么得到的? – MyTitle

+0

我发现'OutputStream'的实例躺在没有关闭但应该是堆的堆上。 (使用JVisualVM:http://docs.oracle.com/javase/6/docs/technotes/tools/share/jvisualvm.html)我跟踪了这​​些实例,发现一个流被关闭了两次,而另一个流从未关闭。典型的复制粘贴,我假设。 –

相关问题