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;
}
}
答案 0 :(得分:1)
我相信在您的特定情况下,没有任何资源泄漏的可能性,因为行fos = new FileOutputStream(file);
是try
组结束前的最后一行,如果您有例外这里不会创建资源fos
。
但是,如果您在该行之后有一个语句,该语句可能会产生异常,执行将移至catch
组,该组以返回方式终止而不释放{{1}中分配的资源}组。
避免警告的最简单方法是在try
中添加以下内容:
catch
如果出现异常,这将确保释放资源。
答案 1 :(得分:0)
在每个catch块中,使用fos.close()
关闭流。
否则,程序可能会点击try块,生成异常并转到catch块而不关闭流。这可能会导致错误。