Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Java中,如果发生异常,如何设置返回类型?_Java_Exception Handling - Fatal编程技术网

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

在Java中,如果发生异常,如何设置返回类型?,java,exception-handling,Java,Exception Handling,嘿,我是Java新手,想知道我是否定义了一个方法来返回数据库对象 像 如果在尝试创建连接时连接失败,我应该返回什么?eclipse告诉我必须返回一个连接对象,但如果它失败了,我不知道该怎么办 谢谢 更新代码以允许异常冒泡: public class DbConn { public Connection getConn() throws SQLException { Connection conn; String hostname = "localhost

嘿,我是Java新手,想知道我是否定义了一个方法来返回数据库对象

如果在尝试创建连接时连接失败,我应该返回什么?eclipse告诉我必须返回一个连接对象,但如果它失败了,我不知道该怎么办

谢谢

更新代码以允许异常冒泡:

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;

    }

}

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

像这样重新定义您的方法

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

在这种情况下,您应该让异常向上传播调用堆栈(将方法声明为
抛出SQLException
,或将其包装到特定于应用程序的异常中),以便在更高的级别捕获和处理它


这就是异常的全部意义:您可以选择捕获它们的位置。

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


另外,行
Class.forName(“com.mysql.jdbc.Driver”).newInstance()的用途是什么?您正在通过反射创建一个新的mysql
驱动程序
对象(为什么?),但您没有对它做任何事情(为什么?)

永远,永远,永远不要使用这样的通用异常。如果没有现成的异常(在本例中为SQLException),请创建自己的异常类型并抛出它。每次我遇到声明它“抛出异常”的东西,结果它这样做是因为它调用声明“抛出异常”的东西,等等,我想掐死启动声明链的白痴。

对不起,但你不应该这样写代码,即使您是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);
    }
}
您还应该知道,除了简单的单线程应用程序之外,连接池是实现任何应用程序的真正途径。

试试这个

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



}

Eclipse说此方法必须返回一种类型的集合,并且在方法delcaration的行中有一个错误图标。@beagleguy,这是因为存在一个不会导致返回或抛出的代码路径。但是,您发布的代码显然不完整,因为它没有显示这样的代码路径。谢谢Peter,我更新了代码以删除try/catch。。第二个版本看起来更好?@beagle,这很好,不过如果您消除
conn
并简单地
返回DriverManager.getConnection(…),您可以稍微改进它最后。此外,您还可以将连接参数的设置分解为一个单独的方法。Eclipse通常足够聪明,可以理解,一旦抛出某个东西,就不需要返回任何东西。但是为了让它高兴,在catch块的末尾加上一个“returnnull;”。@Paul:实际上Eclipse只对catch中的“Unhandled exception type exception”(缺少抛出)感到不高兴。如果我没有这一行,我会不断得到异常:一般异常:没有找到适合jdbc的驱动程序:mysql:///mydb  有没有更好的方法来获取mysql连接对象?@beagleguy,我从谷歌看到,这种创建方法实际上是被推荐的。呵呵。我想jdbc的作者从来没有听说过依赖注入
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");



}