Java 关闭没有有效引用的loader.InputStreams

Java 关闭没有有效引用的loader.InputStreams,java,classloader,appserver,Java,Classloader,Appserver,将sun application server 8.2升级到新的修补程序级别时发生异常,我不知道原因。以下是Servlet中的代码片段: 该文件确实存在于类路径上,在以前的补丁版本中,它工作得很好。但现在部署时会导致异常。堆栈跟踪: [#|2010-04-14T16:43:48.208+0200|WARNING|sun-appserver-ee8.2|javax.enterprise.system.core.classloading|_ThreadID=11;|loader.InputStrea

将sun application server 8.2升级到新的修补程序级别时发生异常,我不知道原因。以下是Servlet中的代码片段:

该文件确实存在于类路径上,在以前的补丁版本中,它工作得很好。但现在部署时会导致异常。堆栈跟踪:

[#|2010-04-14T16:43:48.208+0200|WARNING|sun-appserver-ee8.2|javax.enterprise.system.core.classloading|_ThreadID=11;|loader.InputStreams with no valid reference is closed
java.lang.Throwable
    at com.sun.enterprise.loader.EJBClassLoader$SentinelInputStream.<init>(EJBClassLoader.java:1172)
    at com.sun.enterprise.loader.EJBClassLoader.getResourceAsStream(EJBClassLoader.java:858)
    at java.lang.Class.getResourceAsStream(Class.java:1998)
    at a.package.TestServlet.init(TestServlet.java:44)
    at javax.servlet.GenericServlet.init(GenericServlet.java:261)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:592)
    at org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
    at org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)
    at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)
    at org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:118)
    at org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1093)
    at org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:931)
    at org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4183)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4535)
    at com.sun.enterprise.web.WebModule.start(WebModule.java:241)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1086)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:847)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1086)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:483)
    at org.apache.catalina.startup.Embedded.start(Embedded.java:894)
    at com.sun.enterprise.web.WebContainer.start(WebContainer.java:741)
    at com.sun.enterprise.web.HttpServiceWebContainer.startInstance(HttpServiceWebContainer.java:963)
    at com.sun.enterprise.web.HttpServiceWebContainerLifecycle.onStartup(HttpServiceWebContainerLifecycle.java:50)
    at com.sun.enterprise.server.ApplicationServer.onStartup(ApplicationServer.java:300)
    at com.sun.enterprise.server.PEMain.run(PEMain.java:308)
    at com.sun.enterprise.server.PEMain.main(PEMain.java:221)
|#]
[#|| 2010-04-14T16:43:48.208+0200 |警告| sun-appserver-ee8.2 | javax.enterprise.system.core.classloading | u ThreadID=11;|关闭没有有效引用的loader.InputStreams
java.lang.Throwable
在com.sun.enterprise.loader.EJBClassLoader$SentinelInputStream。(EJBClassLoader.java:1172)
在com.sun.enterprise.loader.EJBClassLoader.getResourceAsStream(EJBClassLoader.java:858)上
在java.lang.Class.getResourceAsStream(Class.java:1998)
位于a.package.TestServlet.init(TestServlet.java:44)
位于javax.servlet.GenericServlet.init(GenericServlet.java:261)
在sun.reflect.NativeMethodAccessorImpl.invoke0(本机方法)处
位于sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
在sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)中
位于java.lang.reflect.Method.invoke(Method.java:592)
位于org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:249)
位于java.security.AccessController.doPrivileged(本机方法)
位于javax.security.auth.Subject.doAsPrivileged(Subject.java:517)
位于org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:282)
位于org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:165)
位于org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:118)
位于org.apache.catalina.core.StandardWrapper.loadServlet(StandardWrapper.java:1093)
位于org.apache.catalina.core.StandardWrapper.load(StandardWrapper.java:931)
位于org.apache.catalina.core.StandardContext.loadOnStartup(StandardContext.java:4183)
位于org.apache.catalina.core.StandardContext.start(StandardContext.java:4535)
位于com.sun.enterprise.web.WebModule.start(WebModule.java:241)
位于org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1086)
位于org.apache.catalina.core.StandardHost.start(StandardHost.java:847)
位于org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1086)
位于org.apache.catalina.core.StandardEngine.start(StandardEngine.java:483)
位于org.apache.catalina.startup.Embedded.start(Embedded.java:894)
位于com.sun.enterprise.web.WebContainer.start(WebContainer.java:741)
位于com.sun.enterprise.web.HttpServiceWebContainer.startInstance(HttpServiceWebContainer.java:963)
在com.sun.enterprise.web.HttpServiceWebContainerLifecycle.onStartup(HttpServiceWebContainerLifecycle.java:50)
位于com.sun.enterprise.server.ApplicationServer.onStartup(ApplicationServer.java:300)
位于com.sun.enterprise.server.PEMain.run(PEMain.java:308)
位于com.sun.enterprise.server.PEMain.main(PEMain.java:221)
|#]
我不知道会有什么问题有人知道吗?
(注意,我更改了代码和stacktrace中的一些名称)

您确定它会引发异常吗?我们在玻璃鱼身上一直收到这样的警告。EJBClassLoader使用throwable转储堆栈跟踪,因此您可能会觉得它是一个异常


EJBClassLoader使用Sentinel包装所有流。此警告只是告诉您流未关闭。你可以放心地忽略它。要消除警告,您必须在使用流后关闭它。

您应该始终在使用以下命令后关闭inputstreams:

public void init() throws ServletException {
    InputStream str = null;
    Properties reqProperties = new Properties();
    try {
        str = this.getClass().getResourceAsStream("/someFile.properties");
        reqProperties.load(str);
    } catch (IOException e) {
        e.printStackTrace();
    } finally {
        if (str != null) {
            try {
                str.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
}
顺便说一句,使用apache commons/io可以简化finally子句:

finally {
    IOUtils.closeQuietly(str);
}
finally {
    IOUtils.closeQuietly(str);
}