elv*_*vis 28 java return try-catch
我不能确切地了解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,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允许你在块中添加一个额外 return的finally块,它会覆盖之前遇到的任何块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)
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)
在这里,您有两个可能的执行路径:
final int i = foo()System.out.println("finally")return iSystem.out.println(e)System.out.println("finally")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语句。
| 归档时间: |
|
| 查看次数: |
4967 次 |
| 最近记录: |