私の実際のプロジェクトで問題を再現する簡単な方法。環境: Android SDK 1.16、Eclipse 4.2.0、Windows。デフォルトの Android アプリケーションを作成し、次のコードを MainActivity.java に追加します。
private void Save1(boolean externalStorage)
{
String s = "12345";
File file;
FileOutputStream fos = null;
if ( externalStorage )
{
try
{
file = new File(getExternalFilesDir(null), "log");
fos = new FileOutputStream(file); // Resource leak: 'fos' is never closed
}
catch(FileNotFoundException e)
{
return;
}
}
else
{
try
{
fos = openFileOutput("log", Context.MODE_PRIVATE);
}
catch(FileNotFoundException e)
{
return;
}
}
try
{
fos.write(s.getBytes());
fos.close();
}
catch(IOException e)
{
return;
}
}
private void Save2(boolean externalStorage)
{
String s = "12345";
File file;
FileOutputStream fos = null;
try
{
file = new File(getExternalFilesDir(null), "log");
fos = new FileOutputStream(file); // OK
}
catch(FileNotFoundException e)
{
return;
}
try
{
fos.write(s.getBytes());
fos.close();
}
catch(IOException e)
{
return;
}
}
fos = new FileOutputStream(file)
関数内の行Save1
、警告:Resource leak: 'fos' is never closed
関数の同じ行Save2
: 警告なし。
テストされていない回答を送信しないでください。問題は見た目ほど単純ではありません。関数のさまざまな部分に追加fos.close()
しても役に立ちません。