问题描述
我无法准确理解 return 在 try、catch 中的工作原理.
I can't understand exactly how return works in try, catch.
- 如果我有 try 和 finally 而没有 catch,我可以将 return 放入 try 块.
- 如果我有try、catch、finally,我不能把return放在尝试块.
- 如果我有一个 catch 块,我必须将 return 放在 try、catch 之外,finally 块.
- 如果我删除 catch 块和 throw Exception,我可以将 return 放在 try 块内.
- If I have try and finally without catch, I can put return inside the try block.
- If I have try, catch, finally, I can't put return in the try block.
- If I have a catch block, I must put the return outside of the try, catch, finally blocks.
- If I delete the catch block and throw Exception, I can put the return inside the try block.
它们究竟是如何工作的?为什么我不能将 return 放在 try 块中?
How do they work exactly? Why I can't put the return in the try block?
带有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; }
带有 try 的代码,finally 没有 catch
Code with try, finally without 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); } }
推荐答案
是的,很混乱.
在Java中,非void函数的所有程序控制路径必须以return结束,或抛出异常.这条规则说得很好,很简单.
In Java, all program control paths of a non-void function must finish with a return, or throw an exception. That's the rule put nice and simply.
但是,令人憎恶的是,Java 允许您将 extra return 放在 finally 块中,这会覆盖之前遇到的任何 返回:
But, in an abomination, Java allows you to put an extra return in a finally block, which overrides any previously encountered return:
try { return foo; // This is evaluated... } finally { return bar; // ...and so is this one, and the previous `return` is discarded }