2010-05-31 9 views
8

hej wszystkim, jestem nowy w Javie i zastanawiałem się, czy mogę zdefiniować sposób, aby powrócić obiektu bazy danychW języku Java, w jaki sposób ustawić typ zwracany, jeśli wystąpi wyjątek?

podoba

import java.sql.*; 

public class DbConn { 

    public Connection getConn() { 
     Connection conn; 
     try { 
      Class.forName("com.mysql.jdbc.Driver").newInstance(); 
      if(System.getenv("MY_ENVIRONMENT") == "development") { 
       String hostname = "localhost"; 
       String username = "root"; 
       String password = "root"; 
      } 
      conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password); 
      return conn; 
     } catch(Exception e) { 
      throw new Exception(e.getMessage()); 
     } 

    } 

} 

jeśli połączenie nie powiedzie się, gdy próbuję go utworzyć co należy zwrócić ? eclipse mówi mi, że muszę zwrócić obiekt Connection, ale jeśli się nie uda, nie jestem pewien, co robić.

dziękuję!

uaktualnionych POZWALAĆ EXCEPTION BUBBLE:

public class DbConn { 

    public Connection getConn() throws SQLException { 
     Connection conn; 
     String hostname = "localhost"; 
     String username = "root"; 
     String password = "root"; 

     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     if(System.getenv("MY_ENVIRONMENT") != "development") { 
      hostname = "localhost"; 
      username = "produser"; 
      password = "prodpass"; 
     } 
     conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password); 
     return conn; 

    } 

} 
+0

Szczerze mówiąc, jestem zdumiony. Eclipse jest zwykle wystarczająco inteligentny, aby zrozumieć, że po rzuceniu czegoś nie trzeba niczego zwracać. Ale aby uszczęśliwić, wstaw "return null;" po zakończeniu bloku catch. –

+0

@Paul: faktycznie Eclipse jest niezadowolony z "Nieobsługiwanego wyjątku typu wyjątkowego" wewnątrz catch (brakujące rzuty). –

Odpowiedz

5

razie zgłaszany jest wyjątek nie ma wartość normalną zwrócone od sposobu. Zwykle kompilator jest w stanie to wykryć, więc nie przeszkadza nawet w ostrzeżeniach/błędach dotyczących stylu "powrotu". Czasami, gdy nie jest to możliwe, musisz podać zwrot "alibi", który w rzeczywistości nigdy nie zostanie wykonany.

Redefiniowanie metoda tak

public Connection getConn() { 
    Connection conn = null; 
    try { 
     Class.forName("com.mysql.jdbc.Driver").newInstance(); 
     if(System.getenv("MY_ENVIRONMENT") == "development") { 
      String hostname = "localhost"; 
      String username = "root"; 
      String password = "root"; 
     } 
     conn = DriverManager.getConnection("jdbc:mysql:///mydb", username, password); 
    } catch(Exception e) { 
     // handle the exception in a meaningful way - do not just rethrow it! 
    } 
    return conn; 
} 

zaspokoi Eclipse :-)

Aktualizacja: Jak inni zwrócili uwagę, ponownie rzuca wyjątek w połów zablokować drogę zrobiłeś to nie jest to dobry pomysł. Jedyną sytuacją, gdy jest to przyzwoite rozwiązanie, jest sytuacja, w której trzeba dokonać konwersji między różnymi typami wyjątków. Na przykład. metoda o nazwie wyrzuca typ wyjątku, którego nie możesz lub nie chcesz propagować w górę (np. ponieważ należy do zastrzeżonej biblioteki lub frameworka i chcesz wyizolować z niego resztę kodu).

Nawet wtedy właściwym sposobem na ponowne wyrzucenie wyjątku jest przekazanie oryginalnego wyjątku do konstruktora nowego (dozwolone są standardowe wyjątki Java i większość wyjątków określonych w strukturze kodu). W ten sposób zostanie zachowany ślad stosu i wszelkie inne informacje w oryginalnym wyjątku. Dobrym pomysłem jest również zarejestrowanie błędu przed ponownym wyrzuceniem. Na przykład.

public void doSomething() throws MyException { 
    try { 
     // code which may throw HibernateException 
    } catch (HibernateException e) { 
     logger.log("Caught HibernateException", e); 
     throw new MyException("Caught HibernateException", e); 
    } 
} 
+0

Eclipse mówi, że ta metoda musi zwracać typ kolekcji i ma ikonę błędu w linii z delaracją metody. – James

+1

@beagleguy, ponieważ jest ścieżka kodu, która nie spowoduje zwrotu lub rzutu. Jednak kod, który wysłałeś, nie jest kompletny, ponieważ nie pokazuje takiej ścieżki kodu. – Yishai

+0

dzięki Peter, zaktualizowałem swój kod, aby usunąć próbę/catch .. 2. wersja wygląda lepiej? – James

1

To jest właśnie sytuacja, w której należy pozwolić wyjątek rozprzestrzeniać się stos wywołań (uznającą metodę jako throws SQLException lub owinąć go w wyjątkiem specyficznych dla aplikacji), aby można było złapać i obsługiwać go na wyższy poziom.

To jest cały punkt wyjątków: możesz wybrać, gdzie je złapać.

5

Powinieneś po prostu wyeliminować cały blok try/catch i zezwolić na wyjątki do propagacji, z odpowiednią deklaracją wyjątku. To wyeliminuje błąd zgłaszany przez Eclipse, a teraz twój kod robi coś bardzo złego: łapiąc i ponownie rzucając wszystkie wyjątki, niszczysz oryginalny ślad stosu i ukrywasz inne informacje zawarte w oryginalnym obiekcie wyjątku.

Plus, jaki jest cel linii Class.forName("com.mysql.jdbc.Driver").newInstance();? Tworzysz nowy obiekt mysql Driver poprzez odbicie (dlaczego?), Ale nic z tym nie robisz (dlaczego?).

+0

Jeśli nie mam tej linii, otrzymuję wyjątek: Ogólne wyjątek: Nie znaleziono odpowiedniego sterownika dla jdbc: mysql: /// mydb czy istnieje lepszy sposób na uzyskanie obiektu połączenia mysql? – James

+1

@beagleguy, widzę od Google, że ta metoda tworzenia jest rzeczywiście zalecana. Huh. Wydaje mi się, że autorzy jdbc nigdy nie słyszeli o Dependency Injection. –

1

Nigdy, przenigdy nie używaj ogólnego wyjątku. Jeśli nie masz gotowego wyjątku (w tym przypadku wyjątku SQLException), utwórz własny typ wyjątku i wyrzuć go.Za każdym razem, gdy napotykam coś, co deklaruje, że "wyrzuca Exception", i okazuje się, że robi to, ponieważ coś, co nazywa, deklaruje "throws Exception", i tak dalej, chcę udusić idiotę, który rozpoczął ten łańcuch deklaracje.

0

Przykro mi, ale nie powinieneś pisać tego kodu, nawet jeśli jesteś nowicjuszem w Javie.

Jeśli musisz napisać coś takiego, bym stał się bardziej jak to:

public class DatabaseUtils 
{ 

    public static Connection getConnection(String driver, String url, String username, String password) throws SQLException 
    { 
     Class.forName(driver).newInstance(); 


     return DriverManager.getConnection(url, username, password); 
    } 
} 

I należy również pamiętać, że pula połączeń jest prawdziwa droga do niczego innego niż prosty, aplikacja z pojedynczym gwintem.

0

Spróbuj jeden

public ActionForward Login(ActionMapping mapping, ActionForm form, 
     HttpServletRequest request, HttpServletResponse response) { 
    MigForm migForm = (MigForm) form;// TODO Auto-generated method stub 

    Connection con = null; 
    Statement st = null; 
    ResultSet rs = null; 

    String uname=migForm.getUname(); 
    String pwd=migForm.getPwd(); 

    try{ 
     Class.forName("oracle.jdbc.driver.OracleDriver"); 
     con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","uname","pwd"); 
     if(con.isClosed()) 
     { 
      return mapping.findForward("success"); 
     } 

     //st=con.createStatement(); 

     }catch(Exception err){ 

     System.out.println(err.getMessage()); 
     } 


      return mapping.findForward("failure"); 



} 
Powiązane problemy