2016-06-10 17 views
0

Я знаю, что обычно streams и formatters (особенно java.util.Formatter) в Java следует закрывать в finally, чтобы избежать утечки ресурсов. Но здесь я немного смущен, потому что я вижу много примеров, когда люди просто закрывают его без какого-либо блока, особенно форматирования. Этот вопрос, возможно, не имеет смысла для некоторых людей, но я хочу быть уверенным в том, о чем я прошу. Некоторые примеры из java2s.com и от tutorialspoint.com, где форматирующие элементы просто закрыты без какого-либо блока.
Пожалуйста, учтите, что мой вопрос касается только Java 6 и более низких версий, потому что я знаю о попытке с ресурсами.Как закрыть Java Formatter, в конце концов или нет?

Пример:

public static void main(String[] args) { 


    StringBuffer buffer = new StringBuffer(); 
    Formatter formatter = new Formatter(buffer, Locale.US); 

    // format a new string 
    String name = "from java2s.com"; 
    formatter.format("Hello %s !", name); 

    // print the formatted string 
    System.out.println(formatter); 

    // close the formatter 
    formatter.close(); 

    // attempt to access the formatter results in exception 
    System.out.println(formatter); 
} 
+0

Было бы лучше, если бы вы предоставили пример вместо ссылки на крупные веб-сайты с базовыми кодами. О каких форматах вас беспокоит? Существует множество классов форматировщиков для всех видов целей, поэтому было бы полезно, если бы вы ограничили это. – micker

+0

@micker Спасибо за уведомление, я уточнил вопрос с более подробной информацией. – karate

ответ

1

В этом конкретном примере, не надо называть close(). Вы только нуждаетесь в, чтобы закрыть форматтер, если базовый appender - Closable. В этом случае вы используете StringBuffer, который не Closable, поэтому звонок close() ничего не делает. Если вы должны были использовать или PrintStream, то они могут быть закрыты, и звонок, чтобы close() был бы необходим, чтобы избежать оставления потока.

Если вы когда-нибудь были уверены, что это Closable, то лучше всего позвонить close() в любом случае. Это не вредит.

+0

Теперь понятно, спасибо! Это был ответ, который я искал. – karate

0

Как об этом, без дальнейших комментариев:

public static void main(String[] args) { 
    StringBuffer buffer = new StringBuffer(); 
    Formatter formatter = null; 
    try { 
    formatter = new Formatter(buffer, Locale.US); 
    String name = "from java2s.com"; 
    formatter.format("Hello %s !", name); 
    System.out.println(formatter); 
    } 
    finally { 
    if (formatter != null) { 
     formatter.close(); 
    } 
    } 
} 
+0

Мой вопрос был, есть ли какая-то конкретная причина, чтобы не закрыть его в конце концов, потому что я подумал, может быть, есть какой-то нюанс, который я хотел бы знать. – karate

+0

Я бы предпочел использовать close() правильно evertime, чтобы получить согласованный стиль кодирования, также это позволит избежать ошибок с будущими версиями java, для случая, когда это необходимо в будущем, или для случая, когда вы будете работать с производный класс, который должен был закрыть его ресурсы. Также я бы рекомендовал прочитать Скотта Мейерса и Херба Саттера - речь идет не о Java, а об общей практике кодирования. – digipenKH

+0

Да, я согласен с вами, но снова моя цель состояла в том, чтобы понять разницу. – karate

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

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