1

Sun アプリケーション サーバー 8.2 を新しいパッチ レベルにアップグレードしているときに、例外が発生しました。その理由はわかりません。Servletからのコード スニペットに従う:

public void init() throws ServletException {
    Properties reqProperties = new Properties();
    try {
        reqProperties.load(this.getClass().getResourceAsStream(
                "/someFile.properties"));
    } catch (IOException e) {
        e.printStackTrace();
    }
    ...
}

ファイルはクラスパスに存在し、以前のパッチ バージョンでは正常に機能していました。しかし、これを展開すると例外が発生します。スタック トレース:

[#|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)
|#]

何が問題なのか、誰にもわかりませんか?(コードとスタックトレースでいくつかの名前を変更したことに注意してください)

4

2 に答える 2

1

本当に例外がスローされますか? Glassfish では、このような警告が常に表示されます。EJBClassLoader は throwable を使用してスタック トレースをダンプするため、例外のように見える場合があります。

EJBClassLoader は、すべてのストリームをセンチネルでラップします。この警告は、ストリームが閉じられていないことを示しているだけです。無視しても問題ありません。警告を取り除くには、使用後にストリームを閉じる必要があります。

于 2010-06-11T13:33:05.200 に答える
1

以下を使用した後は、常に入力ストリームを閉じる必要があります。

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();
            }
        }
    }
}

ところで、finally 句は、apache commons / io を使用してもっと簡単にすることができます:

finally {
    IOUtils.closeQuietly(str);
}
于 2010-06-11T14:04:10.060 に答える