猿问

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

我不能确切地了解如何return在工作trycatch

  • 如果我有tryfinally没有catch,我可以把return里面try块。

  • 如果我有trycatchfinally,我不能忍受returntry块。

  • 如果我有一个catch块,我必须把return在外面trycatchfinally块。

  • 如果删除catch块和throw Exception,则可以将其return放入try块内。

它们究竟如何工作?为什么我不能把它return放在try块里?

代码trycatchfinally

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

     }

 }


明月笑刀无情
浏览 317回答 3
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}

慕运维8079593

如果我尝试了,那就赶上了,最后我不能在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");    }}在这里,您有两种可能的执行路径:final int i = foo()任何一个System.out.println("finally")return i或者System.out.println(e)System.out.println("finally")throw e如果没有抛出异常,则采用路径(1,2)foo。如果引发异常,则采用路径(1,3)。请注意,在两种情况下,如何在离开该方法之前finally执行该块。

哔哔one

最后块将始终执行即使我们陷入异常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语句。
随时随地看视频慕课网APP

相关分类

Java
我要回答