最后如何在Java中尝试返回,返回工作?

时间:2018-06-26 07:12:02

标签: java return try-catch

我无法确切了解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,没有finally的{​​{1}}的代码

catch

7 个答案:

答案 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块中。

您绝对可以。您只需要确保方法中的每个控制路径都正确终止即可。我的意思是:方法中的每个执行路径都以returnthrow结尾。

例如,以下工作原理:

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()
    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块是如何在离开方法之前 执行的。

答案 2 :(得分:4)

即使我们在 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;
  }
}

但是如果您在 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函数以外的公共函数时,您应该返回某些内容,否则您的函数将不会返回。