Java中如何在catch/finally块中返回值?

3
我有下面的代码。如果查询成功执行而没有抛出异常,则应返回true;如果抛出任何异常,则应返回false。最后,语句和连接应该关闭。 我的问题是:在哪里应该编写返回语句?在catch中还是finally中?在下面的代码中,如果查询成功执行我会在try中返回true,在catch中如果抛出任何异常则返回false。我的问题是,如果抛出任何异常,是否会返回false并关闭连接和语句?
try {
            statement = connection.createStatement();
            statement.executeQuery("select * from dual");
            return true;
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
                   return false;
        } finally{
                try {

                        statement.close();

                        connection.close();

                } catch (SQLException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();

                }

        }

我认为它的位置刚好。虽然你的资源逻辑不太好。如果你正在使用Java 7,请考虑使用try-with-resources。 - Juan Alberto López Cavallotti
为什么不自己尝试一下呢?在每个可能的执行路径上放置一个 System.out.println 语句并进行调试?这样你会更好地学习和记忆它。 - Rosdi Kasim
5个回答

8
在两者中都不要使用return语句,将其写在try-catch块外部,在其下方。千万不要在finally块中使用return语句,因为该return语句总是会被执行,从而覆盖try块中的常规return语句!

5
把return语句放在最后一个 } 后面。
    try {
        ...
        return true;
    } catch (SQLException e) {
        e.printStackTrace();
    } finally {
        ...
    }
    return false; // <===== HERE

这样,只有在 try 块内的代码执行时没有抛出异常时,该函数才会返回 true。在所有其他情况下,该函数都将返回false

4

你写的代码不会起作用。为了正确执行带有 finally 块的返回语句,你需要保持状态,即:

boolean result = false;

try
{
 // all good
 result = true;
} 
catch(...)
{
 // crap
 result = false;
}
finally
{
 // close
}
return result;

假设您希望执行finally块中的内容并返回正确的结果。


不确定你的意思,但是finally语句块中的代码将会被执行,即使你在try或者catch块中使用了return关键字。 - Mark Rotteveel

1
最好使用JDK 7并使用新的资源尝试。

是的,try-with-resources 就是为了这种情况而设计的。请参阅 http://docs.oracle.com/javase/tutorial/essential/exceptions/tryResourceClose.html。 - rajah9

1

你可以尝试一下

boolean returnVal = false
try {
            statement = connection.createStatement();
            statement.executeQuery("select * from dual");
            returnVal = true;
    } catch (SQLException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    returnVal = false;
    } finally{
            try {

                    statement.close();

                    connection.close();


            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
         returnVal = false;

            }
    return returnVal;

    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接