java - 放在哪里"返回"在尝试,捕获,最后阻止?

时间:2014-08-13 07:41:56

标签: java try-catch

我正在跟踪Spring Framework源代码,发现了一些对我不友好的代码。 我以为我必须把#34;返回" finally块中的语句,但是这段代码把它放在try块中。

这是源代码。(这是org.springframework.jdbc.core.JdbcTemplate的一部分)

  629       public <T> T query(
  630               PreparedStatementCreator psc, final PreparedStatementSetter pss, final ResultSetExtractor<T> rse)
  631               throws DataAccessException {
  632   
  633           Assert.notNull(rse, "ResultSetExtractor must not be null");
  634           logger.debug("Executing prepared SQL query");
  635   
  636           return execute(psc, new PreparedStatementCallback<T>() {
  637               public T doInPreparedStatement(PreparedStatement ps) throws SQLException {
  638                   ResultSet rs = null;
  639                   try {
  640                       if (pss != null) {
  641                           pss.setValues(ps);
  642                       }
  643                       rs = ps.executeQuery();
  644                       ResultSet rsToUse = rs;
  645                       if (nativeJdbcExtractor != null) {
  646                           rsToUse = nativeJdbcExtractor.getNativeResultSet(rs);
  647                       }
  648                       return rse.extractData(rsToUse);
  649                   }
  650                   finally {
  651                       JdbcUtils.closeResultSet(rs);
  652                       if (pss instanceof ParameterDisposer) {
  653                           ((ParameterDisposer) pss).cleanupParameters();
  654                       }
  655                   }
  656               }
  657           });
  658       }

正如您在第648行所见,它在try块中返回值。最终阻止了。我不知道这有什么用?

7 个答案:

答案 0 :(得分:1)

您的finally阻止不应返回resultset

你可以在finally中写入阻止在发生所有其他错误处理后无条件执行的语句并清理一些资源。

如果一切正常,return阻止try结果集。 并且finally将执行。

如果出现问题,虽然finally会运行,但却没有返回resultset,但因为如果没有生成,则return某些null值没有意义。

答案 1 :(得分:1)

请参阅JLS - 14.20.2. Execution of try-finally and try-catch-finally,有史以来最好的来源:

如果try块的执行由于任何其他原因R突然完成,则执行finally块,然后有一个选择:

  

如果finally块正常完成,那么try语句   由于原因R突然完成。

     

如果finally块因为S而突然完成,则尝试   声明S因突然完成(原因R是   丢弃)。

您可以在returnfinally,这将覆盖try中的其他返回值。

答案 2 :(得分:1)

我认为你应该在try和catch中有一个返回,或者你将returnvalue保存在一个变量中并在try-catch-finally-block之后或者在finally块中返回它。

你不应该在try和finally中使用return语句,或者最后使用catch。最后覆盖了try或catch的返回:

e.g。

private static String getString() {
  try{
    return "a";
  } finally {
    return "b";
  }
}

返回b

答案 3 :(得分:0)

即使你在try块中放入return,java仍会在try块中执行return语句之前执行finally块。

答案 4 :(得分:0)

try finally finally即使tryreturned

finally仍然会被调用

在您的代码中,需要调用{{1}}块中的所有代码,因此没有任何返回是有意义的。

答案 5 :(得分:0)

显示的简单示例,finally如何运作

try
{
   System.out.println("Inside try/catch");
   return 1;
}
finally
{
   System.out.println("Inside finally");
} 

将打印

Inside try/catch
Inside finally  

return

中包含try/catch的下一个代码
try
{
   if (true)
   { 
      throw new RuntimeException();
   }
   System.out.println("Inside try/catch");
   return 1;
}
finally
{
   System.out.println("Inside finally");
}  
尽管有例外,

仍会打印Inside finally。方法将抛出异常

return

中包含finally的下一个代码
try
{
   if (true)
   {
      throw new RuntimeException();
   }
   System.out.println("Inside try/catch");
}
finally
{
   System.out.println("Inside finally");
   return 2;
}

将打印Inside finally,方法将返回2并且不会抛出异常

答案 6 :(得分:0)

将回车放在try块中,并在finally块中完成逻辑后放入一些非常重要的东西(例如解锁或关闭数据库连接)。

你甚至不必陷阱,这是一个可能有帮助的案例:

int releasePermitAndGet() {
    try{
        mLock.lock();
        mPermits++;//release the permit
        permitNotZero.signalAll();// signal the other thread that the conditon has been  changed.
    return mPermites;

}
    finally{
        mLock.unlock();
    }
}