2013-08-07 11 views
7

co jest lepsze dla bloku finally:Zamyka połączenie i zestawienie wreszcie

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

Lub:

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

również, ponieważ pierwszy z nich będzie rzucać NPE ... –

+0

Należy zamknąć oświadczenia przed połączeniem. –

+0

@MarkRotteveel ładna uwaga, czy możesz powiedzieć, dlaczego? – Sajad

Odpowiedz

15

lepszy sposób wykorzystania jest 2 jeden, bo jeśli jest wyjątek podczas inicjowania con lub stat, nie zostaną zainicjowane i mogą zostać zainicjowane do null. W takim przypadku użycie pierwszego kodu spowoduje wyświetlenie NullPointerException.

Również, jeśli jesteś już na Java 7, powinieneś rozważyć użycie try-with-resources, który automatycznie zamyka zasoby. Z połączonego samouczka:

Instrukcja try-with-resources zapewnia zamknięcie każdego zasobu na końcu wyciągu. Każdy obiekt implementujący java.lang.AutoCloseable, który zawiera wszystkie obiekty implementujące java.io.Closeable, może być używany jako zasób.

+0

@ Sajjad. Kliknij link w odpowiedzi. To jest tutorial oracle z try-with-resources. Możesz przejść przez to. –

+0

Ok, czy możemy powiedzieć, że ten "try-with-resources" jest prostszy niż stary sposób? Ponieważ specyfikacja typu wyjątku jest automatyczna i nie ma potrzeby blokowania bloku? – Sajad

+0

@ Sajjad. Jest to prostsze w tym sensie, że nie musisz się martwić zamknięciem jakiegokolwiek zasobu, którego tam używasz. Ale nadal musisz dostarczyć blok "catch". –

0

Jeżeli istnieje możliwość, albo jest null, należy sprawdzić, czy. Jeśli taka możliwość nie istnieje, nie ma uzasadnionego powodu, aby to sprawdzić.

Również można dokonać kod nieznacznie lepiej czytelny przez pominięcie niektórych wsporniki pojedynczym stwierdzeniem:

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

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

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

Mimo osobistych preferencji, naprawdę nie podoba mi się pominięcie nawiasów pojedynczych zdań. Zwłaszcza, gdy zawierają więcej pojedynczych zdań bez nawiasów. Uważam, że trudniej jest odczytać kod, a gdy wcięcie jest niespójne, czytelność jest dalej zmniejszana. – Muel

0

pójdę z drugiej opcji, ale dodanie drugiego zagnieżdżonych finally blok, by upewnić się, że oba con i stat obiekty zaznaczono zbierania śmieci:

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

Żaden z nich są dobre dość. Użyj tego:

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 
      } 
     } 
    } 
} 

i nazwać jak closeQuietly(stat, con);

Albo użyć Java 7 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

Całkiem przyjemne podejście! Ale nadal uważam, że pożądany jest blok "finally" (który ustawia każdy "c = null;"). – Barranka

+0

Nie należy ręcznie ustawiać pól/zmiennych na wartość null, aby "powiadamiać" GC, chyba że zakres jest długi. W powyższym przykładzie mówimy milisekundę lub mniej, a zysk jest niski (jeśli jest). – Xabster

+0

Odpowiedziałem na to zbyt szeroko. W powyższym przykładzie oryginalne odwołania do połączenia i instrukcji nadal istnieją poza tą metodą (ktokolwiek nazwał tę metodę nadal zawiera oryginalne odniesienia), a my po prostu anulowalibyśmy kopie referencji przekazanych do naszej metody. – Xabster

4

jako Java 7, nie musisz już więcej używać bloku finallyl aby zamknąć obiekt połączenia lub instrukcji. Zamiast tego możesz skorzystać z nowych funkcji o nazwie "try-with-resources".

Najpierw zadeklarować połączenie i Statament obiektów za pomocą nowej składni dla bloku try-catch następująco:

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

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

przeciwnym razie, nie musisz się martwić, aby zamknąć wyraźnie powiązania z baza danych w bloku finally, ponieważ jvm zrobi to za Ciebie.

mieć ładne kodowanie ....

Powiązane problemy