如何在try、catch中返回工作,最后在Java中返回



我无法确切理解returntrycatch中是如何工作的。

  • 如果我有tryfinally而没有catch,我可以将return放入try块中
  • 如果我有trycatchfinally,我就不能把return放在try块中
  • 如果我有一个catch块,我必须将return放在trycatchfinally块之外
  • 如果我删除了catch块和throw Exception,我可以将return放在try块中

它们究竟是如何工作的?为什么我不能将return放在try块中?

使用trycatchfinally编码

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的代码,不带catchfinally

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语句之前,将执行最终块

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语句

如果我有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");
}
}

在这里,您有两个可能的执行路径:

  1. final int i = foo()
  2. 要么
    1. System.out.println("finally")
    2. return i
    1. System.out.println(e)
    2. System.out.println("finally")
    3. 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函数以外的公共函数时,应该返回一些东西,否则函数将不会返回。

最新更新