2013-12-19 4 views
1

В следующем коде, где следует закрыть местонахождение? Должно ли это быть в предложении try или, наконец? Если это, наконец, должно быть приложено к другой попытке? Благодарю.Где я должен поместить метод close()?

PrintWriter out = null; 
try { 
    out = new PrintWriter(
      new BufferedWriter(
       new FileWriter("out.txt", true))); 
    out.println("the text"); 
} catch (IOException e) { 
    System.err.println(e); 
} finally { 
    if (out != null) { 
     out.close(); 
    } 
} 
+5

Блок finally будет выполнен независимо от того, что. Поэтому я считаю, что это правильно. – sanket

+1

http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html – HectorLector

+5

Если 1.7 или выше, используйте ['try-with-resources'] (http://docs.oracle.com/javase /tutorial/essential/exceptions/tryResourceClose.html) – khachik

ответ

0

Чтобы правильно обрабатывать close, следует убедиться, что он вызван, возникает ли исключение в коде основной строки, но также следует убедиться, что если close вызывается после исключения в основной строке и затем выбрасывает само исключение, это не приведет к отбрасыванию исключения основной строки; в зависимости от различных факторов, в том числе, был ли объект открыт для чтения или записи, может быть желательно либо пропустить переполнение основной линии (возможно, инкапсулировать информацию о закрытии сбоя), либо зарегистрировать или инкапсулировать исключение основной линии, но close провал просачивается вверх или генерирует исключение «двойной ошибки», которое инкапсулирует обе другие.

Функция примерочного с-ресурсов в Java 7 обеспечивает довольно хорошее поведение для многих сценариев: если исключение происходит в try, а другой в close, последние исключения добавляются к списку подавленных исключений (которые код обработки исключений должен искать). Если предполагается, что метод должен захватывать данные с беспроводного датчика и записывать его в файл, и если вызывающий абонент ожидает, что в случае проблемы с датчиком в файле будет храниться столько информации, сколько было прочитано успешно, тогда не удалось закрыть файл может быть более важным, чем сбой датчика (если датчик, например, включает только команды «вернуть старый элемент» и «удалить старые элементы», затем , если файл закрыт правильно Исключение во время связи с датчиком означает, что любые данные, которые больше не находятся в датчике, будут в файле. Если файл не закрылся должным образом, это означало бы, что может быть постоянная потеря данных, и кому-то следует сказать об этом.

Код для обработки сценария «захват сенсора» в конечном итоге будет немного неприятным: логика считывания датчика будет размещена в блоке try, чья finally будет захватывать любое исключение для переменной. Блок finally должен был бы использовать свой собственный блок try для закрытия; если возникает исключение, выкиньте произвольное исключение writeFileCloseFailure, которое инкапсулирует как исключение (если оно есть) из блока try, так и исключение из close; в противном случае сбросить исключение (если есть) из блока try. Обратите внимание, что поскольку ioException может представлять собой либо неспособность получить данные от датчика (несколько ожидаемый и переносимый), либо неспособность записать файл (очень плохо), упаковка в другом типе исключений позволит вызывающему пользователю различать эти условия.

3

Положите его в блок finally.

Потому что вы должны закрыть Writer в любом случае (исключение или исключение).

4

См. Документацию для try-with-resources. Если вы используете хотя бы Java 7, для этого есть хороший синтаксис. В противном случае блок finally является подходящим, так как он должен быть закрыт как в нормальном, так и в исключительном случаях.

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