0

ここにいくつかのJavaコードがあります。

public class SomeClass {
private Connection connection;

public SomeClass(Connection c) {
    connection = c;
}
public void someWork(){
    Connection c;
    try {
        // do something
    } catch (Exception e) {
        // some exception code
    } finally {
        if (conn != null){
            try {c.close();} catch (Exception e) {}
        }
    }
}

}

でもコードは好きじゃない

if (conn != null){
        try {c.close();} catch (Exception e) {}
    }

だから私はコードだと思う

...catch (Exception e) {
        // some exception code
    } finally {
        c = null;
    }

しかし、「Stream object not Garbage Collected」と表示されます。

finally ブロックでは try-catch ステートメントを使用しません。別の方法を教えてください。

4

7 に答える 7

6

静的ユーティリティ メソッドを作成するだけです。

private static void closeQuietly(final Connection conn)
{
    if (conn == null)
        return;
    try {
        conn.close();
    } catch (WhateverException ignored) {
    }
}

それで

conn = whatever(); // create it there, not in the try block
try {
    // work
} catch (WhateverException e) {
    // whatever
} finally {
    closeQuietly(conn);
}

ただし、最終的には、finally ブロックで try/catchを使用することになります。

キャッチException悪い考えであることに注意してください。代わりに特別に発生した例外をキャッチしますconn.close()。キャッチExceptionするとは、すべてRuntimeExceptionの s もキャッチすることを意味します。それはBad Thing(tm)です。

Guava を使用する場合はCloseables.closeQuietly()、上記のコードとほとんど同じことを行う も使用できます。Closerまた、非常に興味深い をご覧になることもできます。

最後に (しゃれた意図): Java 7 を使用している場合は、代わりに try-with-resources ステートメントを使用してください (「参考文献」を参照AutoCloseable):

try (
    conn = whatever();
) {
    // ...
}
于 2013-06-20T09:21:25.593 に答える
0

無効にしてクローズしない場合は、すべてのメソッドが常に新しいオープン接続を取得するようにしてください。

知っておく必要がある唯一のことは、接続を取得するたびにそれを閉じる必要があることです (したがって、finally ブロック)。そうしないと、アプリケーションでその接続を開いたままにして、最終的に利用可能な接続を使い果たす可能性があります。

于 2013-06-20T09:24:01.290 に答える
0

他の誰かに try-catch-stuff を実行させ、Apache Commons IOUtilsを使用させます

closeQuietly()-methods の 1 つ (例: this one ) は、まさに必要なものである必要があります。

例外が無視されることを除いて、InputStream.close() と同等です。これは通常、finally ブロックで使用されます。

于 2013-06-20T09:23:03.667 に答える
0

Java 7以降、これが想定されています

try (Connection conn = DriverManager.getConnection(props)) {
    ...
}

Java 7 より前

Connection conn = DriverManager.getConnection();
try {
  ...
} finally {
    conn.close();
}
于 2013-06-20T09:23:20.607 に答える