'Endlich Block wird nicht normal abgeschlossen' Eclipse-Warnung

72

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?

José D.
quelle
4
entferne return -1; und es sollte in Ordnung sein
Satya
@ Tennis 'endlich Block nicht normal abgeschlossen' hat er dies in Betreffzeile geschrieben
ManMohan Vyas
Fügen Sie nach dem try-catch-finally-Block return -1 hinzu.
Danpop

Antworten:

127

Entfernen Sie die return-Anweisung daraus. Der letzte Block wird als Bereinigungsblock betrachtet, eine Rückgabe wird im Allgemeinen nicht erwartet.

ManMohan Vyas
quelle
3
Ich sehe, ich sollte die Rückkehr am Ende des Fangs haben ... Danke
José D.
2
Aber gibt es irgendeinen Schaden? Wenn ich das bewusst mache, verstehe ich die Auswirkungen?
Dhiraj
Ich denke, OP wollte -1 zurückgeben, wenn etwas schief gelaufen ist, im ursprünglichen Beitrag wird -1 immer zurückgegeben ...
Bamboomy
27

Das returnvon finally"ü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;
        }
    }
}

1

ALZ
quelle
10

Im Allgemeinen sollte ein finallyBlock niemals eine return-Anweisung haben, da er andere returnAnweisungen oder überschreiben würde Exceptions.

Weitere Informationen und detailliertere Antworten zu den Hintergründen finden Sie in der Frage

Verhalten der Rückgabeanweisung in catch und schließlich

geistLich
quelle
5

Mit beiden returnund der throwAnweisung im finallyBlock erhalten Sie die Warnung. Beispielsweise erhalten Sie dieselbe Warnung mit dem folgenden Endblock:

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

Wenn Sie keine Blöcke haben, müssen catchIhre finallyBlö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;
    }

}
Brad Parks
quelle