为了账号安全,请及时绑定邮箱和手机立即绑定

在Java中,try,catch,return最终如何返回工作?

在Java中,try,catch,return最终如何返回工作?

明月笑刀无情 2021-03-30 12:12:17
我不能确切地了解如何return在工作try,catch。如果我有try和finally没有catch,我可以把return里面try块。如果我有try,catch,finally,我不能忍受return的try块。如果我有一个catch块,我必须把return在外面try,catch,finally块。如果删除catch块和throw Exception,则可以将其return放入try块内。它们究竟如何工作?为什么我不能把它return放在try块里?代码try,catch,finallypublic int insertUser(UserBean user) {     int status = 0;     Connection myConn = null;     PreparedStatement myStmt = null;     try {         // Get database connection         myConn = dataSource.getConnection();         // Create SQL query for insert         String sql = "INSERT INTO user "                    + "(user_name, name, password) "                    + "VALUES (?, ?, ?)";         myStmt = myConn.prepareStatement(sql);         // Set the parameter values for the student         myStmt.setString(1, user.getUsername());         myStmt.setString(2, user.getName());         myStmt.setString(3, user.getPassword());         // Execute SQL insert         myStmt.execute();     } catch (Exception exc) {         System.out.println(exc);     } finally {         // Clean up JDBC objects         close(myConn, myStmt, null);     }     return status; }带有的代码try,finally不带catch public int insertUser(UserBean user) throws Exception {     int status = 0;     Connection myConn = null;     PreparedStatement myStmt = null;     try {         // Get database connection         myConn = dataSource.getConnection();         // Create SQL query for insert         String sql = "INSERT INTO user "                    + "(user_name, name, password) "                    + "VALUES (?, ?, ?)";         myStmt = myConn.prepareStatement(sql);         // Set the parameter values for the student         myStmt.setString(1, user.getUsername());         myStmt.setString(2, user.getName());         myStmt.setString(3, user.getPassword());         // Execute SQL insert         myStmt.execute();         return status;     } finally {         // Clean up JDBC objects         close(myConn, myStmt, null);     } }
查看完整描述

3 回答

?
皈依舞

TA贡献1851条经验 获得超3个赞

是的,令人困惑。


在Java中,非函数的所有程序控制路径都必须以结束,否则将引发异常。这就是简单而明确的规则。voidreturn


但是,令人讨厌的是,Java允许您在一个块中添加一个多余 return的东西finally,它会覆盖以前遇到的任何东西return:


try {

    return foo; // This is evaluated...

} finally {

    return bar; // ...and so is this one, and the previous `return` is discarded

}


查看完整回答
反对 回复 2021-04-28
?
慕运维8079593

TA贡献1876条经验 获得超5个赞

如果我尝试了,那就赶上了,最后我不能在try块中放入return。


你绝对可以。您只需要确保方法中的每个控制路径都正确终止即可。我的意思是:方法中的每个执行路径都以return或结尾throw。


例如,以下工作:


int foo() throws Exception { … }


int bar() throws Exception {

    try {

        final int i = foo();

        return i;

    } catch (Exception e) {

        System.out.println(e);

        throw e;

    } finally {

        System.out.println("finally");

    }

}

在这里,您有两种可能的执行路径:

  1. final int i = foo()

  2. 任何一个

    1. System.out.println("finally")

    2. return i

  3. 或者

    1. System.out.println(e)

    2. System.out.println("finally")

    3. throw e

如果没有抛出异常,则采用路径(1,2)foo。如果引发异常,则采用路径(1,3)。请注意,在两种情况下,如何在离开该方法之前finally执行该块。


查看完整回答
反对 回复 2021-04-28
?
哔哔one

TA贡献1854条经验 获得超8个赞

最后块将始终执行即使我们陷入异常catch块,甚至我们的try块按预期执行。


因此,何时finally块将在流程中执行...


如果我们在try / catch块中有return语句,那么在执行return语句之前,将执行finally块(就像关闭连接或I / O一样)


function returnType process() {

  try {

      // some other statements

      // before returning someValue, finally block will be executed

      return someValue;

  } catch(Exception ex) {

     // some error logger statements

     // before returning someError, finally block will be executed

     return someError;

  } finally {

    // some connection/IO closing statements

    // if we have return inside the finally block

    // then it will override the return statement of try/catch block

    return overrideTryCatchValue;

  }

}

但是,如果您在finally语句中包含return语句,则它将覆盖try或catch块中的return语句。


查看完整回答
反对 回复 2021-04-28
  • 3 回答
  • 0 关注
  • 316 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信