2012-08-02 6 views
7

Затмение (Juno) дает следующее предупреждение:Почему этот код генерирует предупреждение о потенциальной утечке ресурсов?

Потенциальные утечки ресурсов: 'ОС' не может быть закрыт

на первой линии 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.

Является ли это ложным положительным? Это похоже на довольно ванильный анализ пути выполнения.

+0

Было бы проще, если бы вы указали, какое затмение линии жалуется, но я бы предположил, что это связано с линией openFileOuput. Как долго работает открытый объект? Нужно ли закрывать файл? – atk

+2

@atk - OP указывает, что предупреждение находится в первой строке тела try. Итак, 'os = sContext.OpenFileOutput ...'. –

+0

Если 'sContext' равно null, тогда исключение NullPointerException будет выбрано, и, наконец, он никогда не будет запущен, так как это не исключение Except. В этом случае 'os' не будет закрыто (или открыто). –

ответ

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); 
    } 
} 
+0

Я просто попытался, и IntelliJ не вызывает никаких предупреждений о вашем коде. Это еще более убеждает меня в том, что это ложный позитив в Eclipse. И да, я осмелюсь прокомментировать свой ответ :) –

+0

Спасибо за тест IntelliJ. Мне нравится синтаксис Java 7, но, к сожалению, это проект Java 6.:( –

-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) { 
     } 
    } 
} 
+3

Тогда, если 'os' * is * null, вы выбросите исключение NullPointerException в свой' finally'. –

+0

Вопрос в том, будет ли 'sContext.openFileOutput' когда-либо возвращать null? –

+1

@SteveKuo На самом деле вопрос: openFileOutput когда-либо бросает какие-либо исключения в любом случае. –

0

Что делать, если вы двигаетесь как открытые, так и близко к первой статье попробовать? Они генерируют один и тот же тип исключения. И удалите if os! = Null.

+1

Это не сработает - блок 'try' может выйти преждевременно из-за исключения, вызванного' os.write', а затем вызов 'os.close()' будет пропущен. –

 Смежные вопросы

  • Нет связанных вопросов^_^