我无法确切理解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;
}
带try
的代码,不带catch
的finally
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
结束,否则将引发异常。这是一条简单明了的规则。
但是,令人讨厌的是,Java允许您在finally
块中放置一个额外的return
,它覆盖了以前遇到的任何return
:
try {
return foo; // This is evaluated...
} finally {
return bar; // ...and so is this one, and the previous `return` is discarded
}
最后块将始终执行,即使我们在捕获块中捕获到异常,甚至我们的 尝试块所以最后块什么时候会在流中执行。。。 如果我们在try/catch块中有return语句,那么在执行return语句之前,将执行最终块 但是,如果finally语句中有return语句,则它将覆盖try或catch块中的return语句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;
}
}
如果我有try,catch,最后我不能在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
如果foo
未引发异常,则采用路径(1,2)。如果引发异常,则采用路径(1,3)。请注意,在这两种情况下,finally
块是如何在方法离开之前执行的。
当涉及异常处理时,这是正常的程序流。在代码中有catch块创建了一个代码路径可以直接跳转到catch块的情况。这违背了在返回某物的方法中使用return语句的要求。若发生异常,返回语句可能无法执行,所以编译器会抛出错误。因此,为了避免这个问题,在一个方法中至少还需要一个return语句。
如果你在tryfinally块中添加了一个return语句,但没有catch块,那也没关系。这里没有异常代码路径的情况。
如果您在try块中添加了return语句,并且您有catch块,那么您可以在catch块中或在方法的末尾添加return。
如果您在try块中添加了return语句,并且有catch块和finally块,那么您可以在catch块中添加return,也可以在方法的末尾添加return。您也可以选择在finally块中添加return。如果您正在使用eclipse,它将生成一个警告,该警告可以使用下面的上述方法定义-来抑制
@SuppressWarnings("finally")
我想这就是你要问的:
如果我有try,catch,最后我不能在try块中放return。
因此,如果添加catch
块,则无法在try块中放入return
。
问题是,如果添加catch
,则控件会通过删除,并且在方法末尾需要return
,或者这是语法错误。我还没有测试过这一点,但我认为可以在try
块中放置一个return
,但您也必须在catch
中添加一个,或者在方法结束时添加一个。
在第二个示例中,如果发生检查的异常,则它将移交给调用方法。
在第一个示例中,如果检查的异常发生,则它以相同的方法进行处理,因为catch块负责处理异常。
如果您在catch块中编写return语句,那么它就可以工作了
即
try{
return ..
}catch(Exception e){
return ..
}finally{
}
但这不是一个好的编程实践。
当使用void函数以外的公共函数时,应该返回一些东西,否则函数将不会返回。