2010-05-31 32 views
8

hey all, Tôi mới đến Java và đã tự hỏi nếu tôi xác định một phương pháp để trả về một đối tượng cơ sở dữ liệuTrong Java, làm cách nào để đặt loại trả về nếu ngoại lệ xảy ra?

như

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

    } 

} 

nếu kết nối không thành công khi tôi cố gắng tạo ra nó những gì tôi nên trở lại ? eclipse đang nói với tôi rằng tôi phải trả về một đối tượng Connection nhưng nếu nó không thành công thì tôi không chắc phải làm gì.

cảm ơn!

MÃ CẬP NHẬT ĐẾN LET 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

Thẳng thắn mà nói, tôi ngạc nhiên. Eclipse thường đủ thông minh để hiểu rằng một khi bạn ném thứ gì đó, bạn không cần phải trả lại bất cứ thứ gì. Nhưng để làm cho nó hạnh phúc, hãy đặt một "trả về null;" sau khi kết thúc khối đánh bắt. –

+0

@Paul: thực sự Eclipse không hài lòng về "Ngoại lệ loại trừ ngoại lệ" bên trong phần đánh bắt (thiếu số lần ném). –

Trả lời

5

Nếu một ngoại lệ được ném ra, không có giá trị bình thường trở về từ phương pháp này. Thông thường trình biên dịch có thể phát hiện ra điều này, vì vậy nó thậm chí không làm phiền bạn với các cảnh báo/lỗi "yêu cầu trả về". Đôi khi, khi nó không thể làm như vậy, bạn cần phải đưa ra một tuyên bố trở lại "alibi", mà trên thực tế sẽ không bao giờ bị xử tử.

Định nghĩa lại phương pháp của bạn như thế này

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

sẽ làm hài lòng Eclipse :-)

Cập nhật: Như những người khác đã chỉ ra, lại ném một ngoại lệ trong một nắm bắt chặn theo cách bạn đã làm là không phải là một ý tưởng tốt. Tình huống duy nhất khi nó là một giải pháp tốt là nếu bạn cần phải chuyển đổi giữa các loại ngoại lệ khác nhau. Ví dụ. một phương thức được gọi là ném một loại ngoại lệ mà bạn không thể hoặc không muốn lan truyền lên trên (ví dụ: vì nó thuộc về một thư viện hoặc khung công tác độc quyền và bạn muốn tách riêng phần còn lại của mã khỏi nó).

Thậm chí khi đó, cách thích hợp để tính lại ngoại lệ là chuyển ngoại lệ ban đầu sang hàm tạo mới (ngoại lệ Java tiêu chuẩn và hầu hết các trường hợp ngoại lệ cụ thể cho phép điều này). Bằng cách này, dấu vết ngăn xếp và bất kỳ thông tin nào khác trong ngoại lệ ban đầu được giữ lại. Nó cũng là một ý tưởng tốt để đăng nhập lỗi trước khi rethrowing. Ví dụ.

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 đang nói phương pháp này phải trả về một loại Bộ sưu tập và có biểu tượng lỗi trong dòng có phương pháp delcaration. – James

+1

@beagleguy đó là vì có một đường dẫn mã sẽ không dẫn đến trả lại hoặc ném. Tuy nhiên, mã bạn đã đăng dường như không hoàn chỉnh vì nó không hiển thị đường dẫn mã như vậy. – Yishai

+0

cảm ơn Peter, tôi đã cập nhật mã của mình để xóa bản try/catch .. Phiên bản thứ hai trông đẹp hơn? – James

1

này được chính xác tình huống mà bạn nên để cho ngoại trừ tuyên truyền lên các cuộc gọi stack (tuyên bố phương pháp như throws SQLException hoặc gói nó trong một ngoại lệ ứng dụng cụ thể) để bạn có thể nắm bắt và xử lý nó tại một cao hơn cấp độ.

Đó là toàn bộ ngoại lệ: bạn có thể chọn nơi bắt chúng.

5

Bạn chỉ nên loại bỏ toàn bộ khối try/catch và cho phép ngoại lệ lan truyền, với tuyên bố ngoại lệ thích hợp. Điều này sẽ loại bỏ lỗi mà Eclipse đang báo cáo, cộng với ngay bây giờ mã của bạn đang làm điều gì đó rất xấu: bằng cách bắt và ném lại tất cả các ngoại lệ, bạn đang phá hủy dấu vết ngăn xếp ban đầu và ẩn các thông tin khác chứa trong đối tượng ngoại lệ ban đầu.

Ngoài ra, mục đích của đường dây Class.forName("com.mysql.jdbc.Driver").newInstance(); là gì? Bạn đang tạo một đối tượng mysql Driver mới thông qua sự phản chiếu (tại sao?) Nhưng bạn không làm bất cứ điều gì với nó (tại sao?).

+0

Nếu tôi không có dòng đó, tôi tiếp tục nhận ngoại lệ: Ngoại lệ chung: Không tìm thấy trình điều khiển phù hợp cho jdbc: mysql: /// mydb có cách nào tốt hơn để lấy đối tượng kết nối mysql không? – James

+1

@beagleguy, tôi thấy từ Google rằng phương pháp tạo này thực sự được đề xuất. Huh. Tôi đoán các nhà văn của jdbc chưa bao giờ nghe nói về Dependency Injection. –

1

Không bao giờ, chưa từng sử dụng ngoại lệ chung như vậy. Nếu bạn không có ngoại lệ sẵn sàng (trong trường hợp này là SQLException), hãy tạo loại ngoại lệ của riêng bạn và loại bỏ nó.Mỗi lần tôi gặp phải một cái gì đó tuyên bố rằng nó "ném ngoại lệ", và nó chỉ ra rằng nó làm như vậy bởi vì một cái gì đó nó gọi tuyên bố "ném ngoại lệ", và như vậy xuống dòng, tôi muốn bóp nghẹt các idiot người bắt đầu chuỗi khai báo.

0

Tôi xin lỗi, nhưng bạn không nên viết mã như thế này, ngay cả khi bạn mới sử dụng Java.

Nếu bạn phải viết một điều như vậy, tôi muốn làm cho nó nhiều như thế này:

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

Và bạn cũng nên lưu ý rằng hồ bơi kết nối là cách đúng để đi cho bất cứ điều gì khác hơn là một đơn giản, ứng dụng đơn luồng.

0

Hãy thử điều này một

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



} 
Các vấn đề liên quan