Eclipse gibt mir diese Warnung im folgenden Code:
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;
}
}
Was ist los mit meinem Code?
java
try-catch-finally
José D.
quelle
quelle
Antworten:
Entfernen Sie die return-Anweisung daraus. Der letzte Block wird als Bereinigungsblock betrachtet, eine Rückgabe wird im Allgemeinen nicht erwartet.
quelle
Das
return
vonfinally
"überschreibt" weitere Ausnahmen.public class App { public static void main(String[] args) { System.err.println(f()); } public static int f() { try { throw new RuntimeException(); } finally { return 1; } } }
quelle
Im Allgemeinen sollte ein
finally
Block niemals eine return-Anweisung haben, da er anderereturn
Anweisungen oder überschreiben würdeExceptions
.Weitere Informationen und detailliertere Antworten zu den Hintergründen finden Sie in der Frage
Verhalten der Rückgabeanweisung in catch und schließlich
quelle
Mit beiden
return
und derthrow
Anweisung imfinally
Block erhalten Sie die Warnung. Beispielsweise erhalten Sie dieselbe Warnung mit dem folgenden Endblock:... }finally{ throw new RuntimeException("from finally!"); } ...
quelle
Wenn Sie keine Blöcke haben, müssen
catch
Ihrefinally
Blöcke direkt ineinander verschachtelt sein. Es wird nur eine Ausnahme abgefangen, die es Ihrem Code ermöglicht, nach dem Ende eines try / catch / finally-Blocks fortzufahren. Wenn Sie die Ausnahme nicht abfangen, können Sie nach einem finally-Block keinen Code mehr haben!Wie dies mit diesem Beispiel funktioniert, können Sie auf Repl.it sehen
Beispielausgabe
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
Code im Beispiel bei 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; } }
quelle