在Java中,如果发生异常,如何设置返回类型?

时间:2010-05-31 19:19:45

标签: java exception-handling

嘿所有,我是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());
        }

    }

}

如果连接失败,当我尝试创建它应该返回什么? eclipse告诉我我必须返回一个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;

    }

}

6 个答案:

答案 0 :(得分:7)

如果抛出异常,则该方法不返回正常值。通常编译器能够检测到这一点,因此它甚至不会使用“返回必需”样式警告/错误来纠缠您。有时,当它无法这样做时,你需要提供一个“alibi”返回语句,实际上它永远不会被执行。

像这样重新定义你的方法

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块中重新抛出异常并不是一个好主意。它是一个体面的解决方案的唯一情况是,如果您需要在不同的异常类型之间进行转换。例如。一个名为throws的方法抛出一个异常类型,你不能或不想向上传播(例如,因为它属于专有的库或框架,你想要将其余的代码与它隔离开来)。

即使这样,重新抛出异常的正确方法是将原始异常传递给新的构造函数(标准Java异常和大多数特定于框架的异常允许这样做)。这样就可以保留堆栈跟踪和原始异常中的任何其他信息。在重新抛出之前记录错误也是一个好主意。 E.g。

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

答案 1 :(得分:5)

您应该删除整个try/catch块并允许传播异常,并使用适当的异常声明。这将消除Eclipse报告的错误,此外,您的代码正在做一些非常糟糕的事情:通过捕获并重新抛出所有异常,您将破坏原始堆栈跟踪并隐藏原始异常对象中包含的其他信息。 / p>

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

答案 2 :(得分:2)

永远不要使用像这样的通用异常。如果您没有现成的异常(在本例中为SQLException),请创建自己的异常类型并抛出它。每当我遇到一些声明它“抛出异常”的东西时,事实证明它是这样做的,因为它调用的东西声明“抛出异常”,等等,我想要扼杀那个开始那个链条的白痴声明。

答案 3 :(得分:1)

这正是您应该让异常传播到调用堆栈(将方法声明为throws SQLException或将其包装在特定于应用程序的异常中)的情况,以便您可以在更高的位置捕获并处理它水平。

这就是例外的全部要点:你可以选择在哪里抓住它们。

答案 4 :(得分:1)

对不起,即使您是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);
    }
}

您还应该知道,除了简单的单线程应用程序之外,连接池是真正的方法。

答案 5 :(得分: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");



}