2010-05-31 7 views
8

모든 이봐, 나는 자바에 새로운 그리고 난 내가 반환해야 무엇을 만들려고 할 때 연결이 실패 할 경우Java에서 예외가 발생하면 반환 유형을 어떻게 설정합니까?

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()); 
     } 

    } 

} 

같은 데이터베이스 개체를 반환하는 방법을 정의하는 경우 궁금 해서요 ? 이클립스는 Connection 객체를 반환해야한다고 말하고 있지만 실패하면 무엇을 해야할지 잘 모릅니다.

감사합니다.

업데이트 된 코드는 예외 거품을 수 있도록 : 예외가 발생

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

을보십시오. 이클립스는 보통 당신이 무언가를 던지면 아무 것도 반환 할 필요가 없다는 것을 충분히 이해할만큼 똑똑하다. 그러나 그것을 행복하게 만들려면 "return null;"을 넣으십시오. catch 블록이 끝난 후 –

+0

@Paul : 실제로 이클립스는 catch (누락 된 스로우) 안에 "처리되지 않은 예외 유형 예외"에 대해서만 불만을 나타냅니다. –

답변

5

경우, 메서드에서 반환 더 정상적인 값이 없습니다. 일반적으로 컴파일러는이를 감지 할 수 있으므로 "return required"스타일 경고/오류로 사용자를 괴롭히지 않습니다. 때로는 그렇게 할 수 없을 때 "alibi"return 문을 주어야합니다. 실제로는 실행되지 않습니다.

재정처럼 방법이

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

이 업데이트 이클립스 :-)에게 만족 : 다른 사람들이 지적으로, 다시 던지는 캐치에 예외가 당신이 한 길을 차단입니다 좋은 생각이 아닙니다. 괜찮은 솔루션 일 때 유일한 상황은 다른 예외 유형간에 변환해야하는 경우입니다. 예 : 호출되는 메소드는 독점 라이브러리 또는 프레임 워크에 속하고 나머지 코드를 분리하려는 경우와 같이 위쪽으로 전파 할 수 없거나 전달할 수없는 예외 유형을 발생시킵니다.

그렇다고해도 원래 예외를 새 예외의 생성자 (표준 Java 예외 및 대부분의 프레임 워크 특정 예외가 허용)에 전달하는 것이 올바른 방법입니다. 이렇게하면 원래 예외 내의 스택 추적 및 기타 정보가 유지됩니다. 재실행하기 전에 오류를 기록하는 것도 좋은 방법입니다. 예 :

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는이 메소드가 Collection 유형을 리턴해야하고 delcaration 메소드와 함께 줄에 오류 아이콘이 있음을 알립니다. – James

+1

@beagleguy는 반환 또는 throw가 발생하지 않는 코드 경로가 있기 때문입니다. 그러나 게시 한 코드는 코드 경로가 표시되지 않으므로 완료되지 않은 것 같습니다. – Yishai

+0

Peter, 나는 try/catch를 제거하기 위해 제 코드를 업데이트했습니다 .. 두 번째 버전이 더 좋아 보이십니까? – James

1

이 정확하게 당신이 예외가 호출 스택 (throws SQLException 같은 방법을 선언 또는 응용 프로그램 고유의 예외에 포장) 당신이 잡아 더 높은 그것을 처리 할 수 ​​있도록를 전파하도록해야 상황 수평.

그건 예외의 요점입니다 : 당신은 그들을 잡을 곳을 선택할 수 있습니다.

5

전체 try/catch 블록을 제거하고 적절한 예외 선언과 함께 예외가 전파되도록 허용해야합니다. 이렇게하면 Eclipse가보고하는 오류를 제거 할 수있을뿐 아니라 현재 코드가 매우 나쁜 일을하고 있습니다. 모든 예외를 잡아서 다시 던져서 원래 스택 추적을 파괴하고 원래 예외 객체에 포함 된 다른 정보를 숨길 수 있습니다.

또한 라인의 목적은 무엇입니까 Class.forName("com.mysql.jdbc.Driver").newInstance();? 리플렉션 (이유?)을 통해 새로운 mysql Driver 개체를 만들고 있지만 그 작업을 수행하지는 않습니다 (왜?).

+0

내가 그 라인을 가지고 있지 않다면 나는 예외를 계속 얻는다 : 일반 예외 : jdbc : mysql : /// mydb 에 적합한 드라이버가 없다면 mysql 연결 객체를 얻는 더 좋은 방법이 있을까? – James

+1

@beagleguy, 나는이 방법을 실제로 만드는 것이 좋습니다. 허. jdbc의 작성자는 Dependency Injection에 대해 들어 본 적이 없다고 생각합니다. –

1

그런 일반적인 예외를 절대로 사용하지 마십시오. 준비된 예외 (이 경우 SQLException)가없는 경우, 사용자 자신의 예외 유형을 작성하여 던집니다.내가 "예외를 던집니다"라는 것을 알게 될 때마다, 그리고 "예외를 던지다"라고 선언하기 때문에 그렇게하는 것으로 밝혀졌습니다. 그래서 그 줄을 따라, 나는 그 사슬을 시작한 바보를 목 졸라 죽이고 싶습니다. 선언.

0

죄송하지만 Java를 처음 사용하는 경우에도 이와 같은 코드를 작성하면 안됩니다. ,

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

그리고 당신은 또한 연결 풀 간단한 이외의 아무것도 갈 수있는 진정한 방법입니다 알고 있어야합니다 : 당신이 그런 일을 작성해야하는 경우

, 나는 그것을 더 같이 할 것 단일 스레드 응용 프로그램.

0

내가 놀라게 해요, 솔직히이 하나

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"); 



} 
관련 문제