8

Eclipse (Juno) 给出以下警告:

潜在的资源泄漏:“os”可能未关闭

try在这段代码正文的第一行:

static void saveDetails(byte[] detailsData) {
    OutputStream os = null;
    try {
        os = sContext.openFileOutput(DETAILS_FILE_NAME, Context.MODE_PRIVATE);
        os.write(detailsData);
    } catch (IOException e) {
        Log.w(LOG_TAG, "Unable to save details", e);
    } finally {
        if (os != null) {
            try {
                os.close();
            } catch (IOException ignored) {
            }
        }
    }
}

该方法openFileOutput被声明为抛出一个FileNotFoundException.

这是误报吗?这似乎是一个相当普通的执行路径分析。

4

3 回答 3

11

在我看来,这是一个误报。您的资源在“finally”块中关闭,所以我看不出这里可能出了什么问题。

作为旁注,如果您使用的是 Java 7,我建议使用“try-with-resources”习语。

static void saveDetails(byte[] detailsData) {    
    try (OutputStream os = sContext.openFileOutput(DETAILS_FILE_NAME, Context.MODE_PRIVATE);) {
        os = sContext.openFileOutput(DETAILS_FILE_NAME, Context.MODE_PRIVATE);
        os.write(detailsData);
    } catch (IOException e) {
        Log.w(LOG_TAG, "Unable to save details", e);
    }
}
于 2012-08-02T22:22:40.527 回答
0

如果您将 open 和 close 都移至 first try 子句怎么办?他们抛出相同类型的异常。并删除 if os != null。

于 2012-08-02T22:50:40.357 回答
-2

我的猜测是因为你if (os != null)在关闭之前有。由于它是有条件的,因此 OutputStream 可能未关闭。

如果您尝试:

static void saveDetails(byte[] detailsData) {
    OutputStream os = null;
    try {
        os = sContext.openFileOutput(DETAILS_FILE_NAME, Context.MODE_PRIVATE);
        os.write(detailsData);
    } catch (IOException e) {
        Log.w(LOG_TAG, "Unable to save details", e);
    } finally {
        try {
            os.close();
        } catch (IOException ignored) {
        }
    }
}
于 2012-08-02T22:35:55.590 回答