0
private void SaveLog(boolean externalStorage)
{
    String s = tv_log.getText().toString();
    File file;
    FileOutputStream fos;

    if ( externalStorage )
    {
        try
        {
            file = new File(getExternalFilesDir(null), FILE_LOG);
            fos = new FileOutputStream(file);  // Warning: Resource leak: 'fos' is never closed
        }
        catch(FileNotFoundException e)
        {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
            return;
        }
    }
    else
    {
        try
        {
            fos = openFileOutput(FILE_LOG, Context.MODE_PRIVATE);
        }
        catch(FileNotFoundException e)
        {
            Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
            return;
        }
    }


    try
    {
        fos.write(s.getBytes());
        fos.close();
    }
    catch(IOException e)
    {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        return;
    }
}

为什么警告显示在行中fos = new FileOutputStream(file)?有趣的是,如果我删除if ( externalStorage )并只留下第一个分支,则不会显示警告:

private void SaveLog(boolean externalStorage)
{
    String s = tv_log.getText().toString();
    File file;
    FileOutputStream fos;

    try
    {
        file = new File(getExternalFilesDir(null), FILE_LOG);
        fos = new FileOutputStream(file);  // OK!
    }
    catch(FileNotFoundException e)
    {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        return;
    }

    try
    {
        fos.write(s.getBytes());
        fos.close();
    }
    catch(IOException e)
    {
        Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show();
        return;
    }
}
4

2 回答 2

1

我相信在您的特定情况下,没有任何资源泄漏的可能性,因为该行fos = new FileOutputStream(file);是组结束之前的最后一行try,如果您在这里有异常,则fos不会创建资源。

但是,如果您在该行之后有一个语句,该语句可能会产生异常,执行将移至以catch返回终止的组,而不会释放该try组中分配的资源。

避免警告的最简单方法是在 中添加以下内容catch

catch(FileNotFoundException e) 
{ 
    try { if(fos != null) fos.close();} catch (Exception e2) {} //Add this line
    Toast.makeText(this, e.getMessage(), Toast.LENGTH_SHORT).show(); 
    return; 
} 

这将确保在引发异常时释放资源。

于 2012-10-16T09:58:50.937 回答
0

在每个 catch 块中,使用 . 关闭流fos.close()

否则,程序可能会遇到 try 块,生成异常并转到 catch 块,而不会关闭流。这可能会导致错误。

于 2012-10-16T10:06:37.647 回答