2016-06-10 28 views
0

Ich weiß, dass normalerweise streams und formatters (besonders java.util.Formatter) in Java in finally geschlossen werden sollte, um Ressourcenlecks zu vermeiden. Aber hier bin ich ein wenig verwirrt, weil ich viele Beispiele sehe, wo Leute es einfach schließen, ohne irgendeinen Block zu blockieren, besonders die Formatierer. Diese Frage mag für einige Leute keinen Sinn ergeben, aber ich möchte sicher sein, dass ich mich danach erkundige. Einige Beispiele aus java2s.com und aus tutorialspoint.com, wo die Formatierer nur ohne Block geschlossen sind.
Bitte beachten Sie, dass meine Frage nur für Java 6 und niedrigere Versionen gilt, weil ich über Versuche mit Ressourcen weiß.Wie schließe ich Java Formatter, endlich oder nicht?

Beispiel:

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

Es wäre besser, wenn Sie ein Beispiel angeben, statt auf große Codebasis-Websites zu verweisen. Um welche Arten von Formatierern geht es dir? Es gibt viele Formatierungsklassen für alle möglichen Zwecke, daher wäre es hilfreich, wenn Sie das eingrenzen. – micker

+0

@micker danke für die Kündigung, ich habe die Frage mit weiteren Details aktualisiert. – karate

Antwort

1

In diesem speziellen Beispiel ist es nicht notwendig ist close() zu nennen. Sie nur benötigen, um den Formatierer zu schließen, wenn der zugrunde liegende Appender Closable ist. In diesem Fall verwenden Sie eine StringBuffer, die nicht Closable ist, so dass der Aufruf an close() nichts tut. Wenn Sie Writer oder PrintStream verwenden, sind diese verschließbar und der Aufruf an close() wäre erforderlich, um zu vermeiden, den Stream geöffnet zu lassen.

Wenn Sie sich jemals unsicher sind, ob es Closable ist, ist es am besten, nur close() auf jeden Fall zu rufen. Kein Schaden dabei.

+0

Jetzt ist es klar, danke! Das war die Antwort, nach der ich suchte. – karate

0

Wie wäre es damit, ohne weitere Kommentare:

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

Meine Frage war, ob es einen bestimmten Grund gibt, es nicht endlich zu schließen, weil ich dachte, dass es vielleicht Nuancen gibt, die ich gerne wissen würde. – karate

+0

Ich würde es vorziehen, close() korrekt evertime zu verwenden, um einen konsistenten Kodierungsstil zu erhalten, auch dies würde Fehler mit zukünftigen Versionen von Java vermeiden, für den Fall, dass Schließen in der Zukunft benötigt wird, oder für den Fall, mit dem Sie arbeiten werden eine abgeleitete Klasse, die ihre Ressourcen schließen musste. Auch würde ich empfehlen, Scott Meyers und Herb Sutter zu lesen - es geht nicht um Java, sondern um allgemeine Programmierpraxis. – digipenKH

+0

Ja, ich stimme Ihnen zu, aber mein Ziel war es, den Unterschied zu verstehen. – karate