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

elv*_*vis 28 java return try-catch

我不能确切地了解return工程try,catch.

  • 如果我有tryfinally没有catch,我可以把return里面try块.
  • 如果我有try,catch,finally,我不能忍受returntry块.
  • 如果我有一个catch块,我必须把return在外面try,catch,finally块.
  • 如果我删除了catchthrow Exception,我可以把return里面try块.

它们如何正常工作?为什么我不能把它return放在try一块?

代码try,catch,finally

 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;
 }
Run Code Online (Sandbox Code Playgroud)

代码用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);
     }
 }
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 38

是的,这令人困惑.

在Java中,非函数的所有程序控制路径必须以a结束,否则抛出异常.这就是规则很简单.voidreturn

但是,令人厌恶的是,Java允许你在块中添加一个额外 returnfinally块,它会覆盖之前遇到的任何块return:

try {
    return foo; // This is evaluated...
} finally {
    return bar; // ...and so is this one, and the previous `return` is discarded
}
Run Code Online (Sandbox Code Playgroud)

  • @Prof.Falken现在我有一种尝试`try {return i ++; } finally {return i ++; 我甚至写这篇评论都觉得很脏...... (13认同)
  • "这会覆盖之前遇到的任何回报"或抛出. (6认同)
  • 所以你可以'try {return something_with_side_effects(); } finally {return bar;}`在调试时有额外的混乱?!:-D (2认同)

Kon*_*lph 10

如果我尝试了,赶上,最后我不能把它放在try块中.

你绝对可以.您只需要确保方法中的每个控制路径都正确终止.我的意思是:通过你的方法的每个执行路径都以a return或a 结尾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");
    }
}
Run Code Online (Sandbox Code Playgroud)

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

  1. final int i = foo()
    1. System.out.println("finally")
    2. return i
  2. 要么
    1. System.out.println(e)
    2. System.out.println("finally")
    3. throw e

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


小智 6

最后块将始终执行即使我们陷入异常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;
  }
}
Run Code Online (Sandbox Code Playgroud)

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