我正在跟踪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块中返回值。最终阻止了。我不知道这有什么用?
答案 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是 丢弃)。
您可以在return
中finally
,这将覆盖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
即使try
有returned
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();
}
}