【发布时间】:2018-12-04 19:44:19
【问题描述】:
我无法确切了解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 不带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);
}
}
【问题讨论】:
-
这就是为什么在
try-catch或try-catch-finally中包含return是一个糟糕的设计。考虑this 问题。 -
IMO,在
try块中返回是完全正常的,但您需要确保在 allcatch块中返回一些东西。除此之外,请注意 Bathsheba mentioned 的内容。这本质上是关于单一退出点的相同辩论 - 在if块中返回是否不好。 -
@soufrk 不,这显然不是糟糕的设计。如果您返回范围在
try块内的内容,请务必从try内部返回。 不要扩大你想要返回的变量的范围。 那将是糟糕的设计(使范围尽可能小)。 -
@soufrk 如果你没有从 try 或 catch 中返回,它 finally 语句是没有用的。这就是它存在的原因,因此 Java 不需要
goto进行清理。不过,我想不出一个很好的理由从最后回来。我认为这是语言设计中的错误。