我无法确切了解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
,没有finally
的{{1}}的代码
catch
答案 0 :(得分:37)
是的,令人困惑。
在Java中,非void
函数的所有所有程序控制路径都必须以return
结尾,否则将引发异常。这就是规则,简单明了。
但是,令人讨厌的是,Java允许您在return
块中放入 extra finally
,该块将覆盖以前遇到的所有return
:>
try {
return foo; // This is evaluated...
} finally {
return bar; // ...and so is this one, and the previous `return` is discarded
}
答案 1 :(得分:10)
如果我尝试了,赶上,最后我不能将return放在try块中。
您绝对可以。您只需要确保方法中的每个控制路径都正确终止即可。我的意思是:方法中的每个执行路径都以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
块是如何在离开方法之前 执行的。
答案 2 :(得分:4)
最后块也将始终执行。
因此,何时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语句。
>答案 3 :(得分:0)
这是涉及异常处理时的正常程序流程。在代码中包含catch块会创建一种情况,其中代码路径可以直接跳入catch块。这违反了在返回内容的方法中具有return语句的任务。如果发生异常,则return语句可能无法执行,因此编译器会引发错误。因此,为避免此问题,方法中至少需要再包含1条return语句。
如果您在try-finally块中添加了return语句,但没有catch块,则可以。这里没有异常代码路径的情况。
如果您在try块中添加了return语句,并且具有catch块,则可以在catch块中或方法末尾添加return。
如果在try块中添加了return语句,并且具有catch块和finally块,则可以在catch块中或方法末尾添加return。您也可以选择在finally块中添加返回。如果您使用的是eclipse,它将生成一个警告,可以使用下面的上述方法定义-
@SuppressWarnings("finally")
答案 4 :(得分:-1)
我想这就是你要问的:
如果我尝试了,赶上了,最后我不能在try块中放回车了。
因此,如果添加catch
块,则不能在try块中放置return
。
问题在于,如果您添加catch
,然后控件插入,并且在方法末尾需要return
,否则可能是语法错误。我尚未对此进行测试,但我假设您可以将return
放在try
块中,但是您还必须在catch
内添加一个像现在一样在方法结束时。
答案 5 :(得分:-2)
在第二个示例中,如果发生检查的异常,则它将移交给调用方法。
在第一个示例中,如果发生检查的异常,则它以相同的方法处理,因为catch块负责处理异常。
如果您在catch块中编写return语句,那么它将起作用。
即
try{
return ..
}catch(Exception e){
return ..
}finally{
}
但这不是好的编程习惯。
答案 6 :(得分:-4)
使用除void函数以外的公共函数时,您应该返回某些内容,否则您的函数将不会返回。