2010-05-31 15 views
8

嘿,我是新来的Java,并想知道如果我定义了一个方法,如果当我尝试去创造我应该返回连接失败返回一个数据库对象在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对象,但如果失败,我不知道该怎么做。

谢谢!

更新的代码TO LET EXCEPTION泡泡:

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

坦率地说,我很惊讶。 Eclipse通常足够聪明,可以理解一旦你抛出一些东西,你不需要返回任何东西。但为了让它开心,把一个“返回null” catch块结束后。 – 2010-05-31 19:29:44

+0

@Paul:实际上Eclipse只对catch中的“未处理的异常类型异常”感到不满(丢失的引用)。 – 2010-05-31 21:07:10

回答

5

如果抛出一个异常,有从方法没有返回正常值。通常编译器能够检测到这一点,所以它甚至不会用“需要返回”样式的警告/错误来纠缠你。有时,当它无法做到的时候,你需要给出一个“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; 
} 

将满足的Eclipse :-)

更新:正如其他人所指出的那样,重新抛出在catch异常块,你做的方式是不是一个好主意。当它是一个体面的解决方案的唯一情况是如果你需要在不同的异常类型之间进行转换。例如。一个被调用的方法抛出一个你不能或不想向上传播的异常类型(例如,因为它属于一个专有的库或框架,并且你想把它的其余代码与它隔离)。

即使是这样,重新抛出异常的正确方法是通过原始异常到一个新的构造函数(标准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类型,并且在方法解析中有一个错误图标。 – James 2010-05-31 19:23:45

+1

@beagleguy这是因为有一个代码路径不会导致返回或抛出。但是,您发布的代码显然不完整,因为它没有显示这样的代码路径。 – Yishai 2010-05-31 19:28:39

+0

感谢彼得,我更新了我的代码,以删除try/catch ..第二版看起来更好? – James 2010-05-31 19:47:06

1

这正是你应该让异常传播到调用堆栈(声明方法为throws SQLException或一个应用程序特定的异常包裹它),这样你可以捕捉并以更高的处理它的情况水平。

这是例外的整点:你可以选择在哪里抓住他们。

5

你应该只消除整个try/catch块,并允许例外传播,用适当的例外声明。这将消除了Eclipse报告错误,再加上现在你的代码做一些非常糟糕的:通过捕获和重新抛出的所有异常,你就破坏了原来的堆栈跟踪和隐藏包含在原来的异常对象等信息。

另外,什么是线Class.forName("com.mysql.jdbc.Driver").newInstance();的目的是什么?你通过反思创建一个新的mysql Driver对象(为什么?),但你没有做任何事情(为什么?)。

+0

如果我没有这条线,我不断收到异常: 一般例外:找不到合适的驱动程序找到jdbc:mysql:/// mydb 有没有更好的方法来获取mysql连接对象? – James 2010-05-31 19:30:45

+1

@beagleguy,我从Google看到,这种创建方法实际上是推荐的。呵呵。我猜jdbc的作者从来没有听说过依赖注入。 – 2010-05-31 19:41:33

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



} 
相关问题