2016-08-16 7 views
-1

Mit JDK 6 und unten habe ich viele Code-Schnipsel mit try - finally Blöcke wie unten gesehen.Java try - endlich design

Warum initialisiere Leser auf null und dann im try Block zuweisen. Würde unter Vorlage besser (frage mich wenn ich etwas vermisse)? Meine Gründe ... wir vermeiden Null-Einchecken und blockieren schließlich, und wenn der Leser nicht initialisiert hat, dann muss ich nichts anderes tun.

private void doSomething() throws IOException { 
    FileReader reader = new FileReader("someFile"); 
    try { 

     ..... 
    } finally { 
     reader.close(); 
    } 
} 
+0

Nicht wirklich! Wenn der Konstruktor eine Ausnahme auslöst, muss der Rest der Methode sowieso nichts tun. Siehe throws-Klausel? – Stackee007

Antwort

0

Allein, die Deklaration stellt kein Problem dar, aber wenn Sie weitere Ressourcen hinzufügen, die geschlossen werden müssen, erhalten Sie eine Menge nicht abgeschlossener Ressourcen. Besser, sie draußen als null zu deklarieren, und handhaben, innen mit finally zu schließen.

Schlechte Umsetzung

private void doSomething() throws IOException { 
    FileReader reader = new FileReader("someFile"); 
    FileWriter writer = new FileWriter("someFile2"); //throws exception 
    try { 

     ..... 
    } finally { 
     reader.close(); 
     writer.close(); 
    } 
} //reader remains unclosed 

Jetzt haben wir eine nicht geschlossene Filereader, weil ein anderer Konstruktor eine Ausnahme ausgelöst hat.

ordnungsgemäße Umsetzung

private void doSomething() throws IOException { 
    FileReader reader = null; 
    FileWriter writer = null; 
    try { 
     reader = new FileReader("someFile"); 
     writer = new FileWriter("someFile2"); //throws exception 
    } finally { 
     if(reader != null) 
      reader.close(); //closes properly 
     if(writer != null) //skipped 
      writer.close(); 
    } 
} 
+0

Ich habe es nicht mit mehreren Ressourcen zu tun ... das trifft also nicht zu – Stackee007

+0

@ Stackee007 Es ist Konvention, und wenn Sie sich entscheiden, zwei Ressourcen zu verwenden, müssen Sie Ihren Code nicht umgestalten, um ihn zu unterstützen. – Compass