2013-08-07 10 views
7

Was ist besser für finally-Block:Verbindung schließen und Aussage schließlich

finally { 
     try { 
      con.close(); 
      stat.close(); 
     } catch (SQLException sqlee) { 
      sqlee.printStackTrace(); 
     } 
    } 

Oder:

finally { 
     try { 
      if (con != null) { 
       con.close(); 
      } 
      if (stat != null) { 
       stat.close(); 
      } 
     } catch (SQLException sqlee) { 
      sqlee.printStackTrace(); 
     } 
    } 
+0

Nun, da der erste, der eine NPE werfen würde ... –

+0

Sie sollten die Erklärung, bevor die Verbindung schließen. –

+0

@MarkRotteveel nette Anmerkung, können Sie sagen, warum? – Sajad

Antwort

15

besseren Weg, die zweite eine verwenden, denn wenn eine Ausnahme ausgelöst wird, während con oder stat Initialisierung Sie werden nicht initialisiert und können auf null initialisiert werden. In diesem Fall wird mit dem ersten Code NullPointerException ausgelöst.

Wenn Sie bereits auf Java 7 sind, sollten Sie in Betracht ziehen, try-with-resources zu verwenden, die die Ressourcen automatisch schließt. Aus dem verknüpften Lernprogramm:

Die try-with-resources-Anweisung stellt sicher, dass jede Ressource am Ende der Anweisung geschlossen ist. Jedes Objekt, das java.lang.AutoCloseable implementiert, das alle Objekte enthält, die java.io.Closeable implementieren, kann als Ressource verwendet werden.

+0

@Sajjad. Klicken Sie auf den Link in der Antwort. Das ist Orakel-Tutorial von Try-with-Resources. Du kannst es durchgehen. –

+0

Ok, können wir sagen, dass diese 'try-with-resources' einfacher als die alte ist? Weil die Spezifikation des Ausnahmetyps automatisch und keine Blockierung erforderlich ist? – Sajad

+0

@Sajjad. Es ist einfacher in dem Sinne, dass Sie sich keine Sorgen darüber machen müssen, dass Sie dort Ressourcen schließen. Aber Sie müssen immer noch einen "Fang" -Block bereitstellen. –

0

Wenn die Möglichkeit besteht, entweder ist null, Sie, dass der Check müssen. Wenn die Möglichkeit nicht besteht, gibt es keinen triftigen Grund, nach dieser Möglichkeit zu suchen.

Auch Sie können Ihren Code etwas besser lesbar durch Weglassen einiger Einzel Anweisung Klammern machen:

finally { 
    try { 
     if (con != null) 
      con.close(); 

     if (stat != null) 
      stat.close(); 

    } catch (SQLException sqlee) { 
     sqlee.printStackTrace(); 
    } 
} 
+2

Obwohl ich persönlich bevorzuge, mag ich wirklich das Weglassen von Klammern für einzelne Anweisungen. Vor allem, wenn sie mehr einzelne Anweisungen ohne Klammern enthalten. Ich finde es viel schwieriger, Code zu lesen, und wenn der Eindruck inkonsistent ist, wird die Lesbarkeit weiter reduziert. – Muel

0

ich mit der zweiten Option gehen würde, aber einen zweiten verschachtelten finally Block hinzufügen, nur um sicher zu stellen, dass beiden con und stat Objekte für die Garbage Collection markiert sind:

finally { 
    try { 
     if(con != null) 
      con.close(); 
     if(stat != null) 
      stat.close(); 
    } catch(SQLException sqlee) { 
     sqlee.printStackTrace(); 
    } finally { // Just to make sure that both con and stat are "garbage collected" 
     con = null; 
     stat = null; 
    } 
} 
6

Keiner von ihnen ist gut genug. Verwenden Sie diese Option:

public static void closeQuietly(AutoCloseable ... closeables) { 
    for (AutoCloseable c : closeables) { 
     if (c != null) { 
      try { 
       c.close(); 
      } catch (Exception e) { 
       // log or ignore, we can't do anything about it really 
      } 
     } 
    } 
} 

Und nennen Sie es wie closeQuietly(stat, con);

Oder verwenden Java 7 des try-with-resource:

List<String> results = new ArrayList<>(); 
    try (Statement statement = conn.createStatement(); 
     ResultSet rs = statement.executeQuery(query)) { 

     int numberOfColumns = getColumnCount(rs); 
     while (rs.next()) { 
      int i = 1; 
      while (i <= numberOfColumns) { 
       results.add(rs.getString(i++)); 
      } 
     } 
    } 
+0

Ziemlich nette Annäherung! Aber ich denke immer noch, dass ein 'finally'-Block (der jedes' c = null; 'setzt) ​​wünschenswert ist. – Barranka

+0

Sie sollten Felder/Variablen nicht manuell auf null setzen, um den GC zu benachrichtigen, es sei denn, der Bereich ist lang. Im obigen Beispiel sprechen wir eine Millisekunde oder weniger und die Verstärkung ist gering (falls vorhanden). – Xabster

+0

Ich antwortete dieser eine zu breite. Im obigen Beispiel existieren die ursprünglichen Verweise auf die Verbindung und die Anweisung weiterhin außerhalb dieser Methode (wer auch immer die Methode aufgerufen hat, hat immer noch die ursprünglichen Verweise) und wir würden nur die Kopien der Verweise löschen, die an unsere Methode übergeben wurden. – Xabster

4

Ab Java 7, Sie brauchen nicht mehr die finallyl Block verwenden, um zu schließen ein Verbindungs- oder Anweisungsobjekt Stattdessen können Sie die neuen Funktionen "Try-with-resources" nutzen.

Zuerst erklären Sie, um eine Verbindung und Statament Objekte durch die neue Syntax für einen Try-Catch-Block wie folgt verwendet:

try(Connection con = DriverManager.getConnection(database-url, user, password); Statement st = conn.createStatement()) { 

//your stuffs here 
} catch (SQLException e) { 
    e.printStackTrace(); 
}  

Dabei werden Sie nicht kümmern müssen explizit die Verknüpfung mit dem schließen Datenbank in einem finally-Block, weil der jvm es für Sie tun wird.

Haben schöne Codierung ....

Verwandte Themen