Eclipse 警告‘ finally block does not complete Normal’‘ finally 块不能正常完成’

Eclipse 在下面的代码中给出了这个警告:

public int getTicket(int lotteryId, String player) {
try {
c = DriverManager.getConnection("jdbc:mysql://" + this.hostname + ":" + this.port + "/" + this.database, this.user, this.password);
int ticketNumber;


PreparedStatement p = c.prepareStatement(
"SELECT max(num_ticket) " +
"FROM loteria_tickets " +
"WHERE id_loteria = ?"
);
p.setInt(1, lotteryId);
ResultSet rs = p.executeQuery();
if (rs.next()) {
ticketNumber = rs.getInt(1);
} else {
ticketNumber = -1;
}


ticketNumber++;


p = c.prepareStatement(
"INSERT INTO loteria_tickets " +
"VALUES (?,?,?,?)");
p.setInt(1, lotteryId);
p.setInt(2, ticketNumber);
p.setString(3, player);
p.setDate(4, new java.sql.Date((new java.util.Date()).getTime()));
p.executeUpdate();


return ticketNumber;
} catch (Exception e) {
e.printStackTrace();
} finally {
if (c != null) {
try {
c.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
return -1;
}
}

我的代码有什么问题吗?

63886 次浏览

从中删除 return 语句。 最后一个块被认为是清理块,一般不会返回。

来自 finallyreturn“覆盖”进一步的异常抛出。

public class App {
public static void main(String[] args) {
System.err.println(f());
}
public static int f() {
try {
throw new RuntimeException();
} finally {
return 1;
}
}
}

1

通常,finally块不应该有 return 语句,因为它会覆盖其他 return-语句或 Exceptions

如需进一步阅读和更详细的背景答案,请参阅问题

Catch 和 finally 中 return 语句的行为

使用 finally区块中的 returnthrow语句,您将获得警告,例如,您将获得以下 finally 区块的相同警告:

...
}finally{
throw new RuntimeException("from finally!");
}
...

如果您没有任何 catch块,那么您的 finally块必须直接嵌套在彼此内部。它只捕获一个异常,该异常允许代码在 try/catch/finally 块结束后继续执行。如果您没有捕捉到异常,那么在 finally 块之后就不会有任何代码了!

您可以看到这是如何工作的 使用 Repl.it 上的这个示例

输出示例

testing if 0 > 5 ?
try1
try2
finally3
catch1
finally2
After other finally
finally1
end of function


testing if 10 > 5 ?
try1
try2
try3
success
finally3
finally2
finally1
   

Repl.it 的示例代码

class Main {


public static void main(String[] args) {
isGreaterThan5(0);
isGreaterThan5(10);
}


public static boolean isGreaterThan5(int a)
{
System.out.println();
System.out.println("testing if " + a + " > 5 ?");
try
{
System.out.println("try1");
try
{
System.out.println("try2");
try
{
if (a <= 5)
{
throw new RuntimeException("Problems!");
}


System.out.println("try3");


System.out.println("success");
return true;
}
finally
{
System.out.println("finally3");
}
}
catch (Exception e)
{
System.out.println("catch1");
}
finally
{
System.out.println("finally2");
}
System.out.println("After other finally");
}
catch (Exception e)
{
System.out.println("failed");
return false;
}
finally
{
System.out.println("finally1");
}


System.out.println("end of function");
return false;
}


}