Ответ 1
удалить из него возвращаемый оператор. Заключительный блок считается блоком очистки, в нем обычно не ожидается возврат.
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;
}
}
Что не так с моим кодом?
удалить из него возвращаемый оператор. Заключительный блок считается блоком очистки, в нем обычно не ожидается возврат.
return
from finally
"переопределяет" дальнейшее исключение броска.
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
.
Для дальнейшего чтения и более подробных ответов на его исходные материалы см. вопрос
С инструкциями return
и throw
в блоке finally
вы получите предупреждение, например, вы получите такое же предупреждение со следующим блоком 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
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;
}
}