Eclipse-Warnung „Endlich Block wird nicht normal abgeschlossen“.

Lesezeit: 3 Minuten

Benutzer-Avatar
Jos D.

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 + "https://stackoverflow.com/" + 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 falsch an meinem Code?

  • entfernen return -1 ; und es sollte gut sein

    – Satja

    5. Juli 2013 um 4:50 Uhr

  • @Dennis ‘endlich Block wird nicht normal abgeschlossen’ hat er dies in die Betreffzeile geschrieben

    – ManMohan Vyas

    5. Juli 2013 um 4:51 Uhr


  • Fügen Sie nach dem try-catch-finally-Block return -1 hinzu.

    – danpop

    18. Mai 2018 um 13:37 Uhr

entfernen Sie die return-Anweisung daraus. Der letzte Block gilt als Aufräumblock, eine Rückkehr wird in ihm im Allgemeinen nicht erwartet.

  • Ich verstehe, ich sollte die Rückgabe am Ende des Fangs haben … Danke

    – José D.

    5. Juli 2013 um 4:54 Uhr

  • Aber gibt es einen Schaden? Wenn ich dies bewusst mache, verstehe ich die Auswirkungen?

    – Dhiraj

    17. November 2016 um 0:13 Uhr

  • Ich denke, OP wollte -1 zurückgeben, wenn etwas schief gelaufen ist, im ursprünglichen Beitrag ist -1 stets ist zurückgekommen…

    – MadBoomy

    31. Mai 2017 um 14:36 ​​Uhr

Das return aus finally “überschreibt” weiteres Auslösen von 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

Benutzer-Avatar
geistlich

Allgemein a finally block sollte niemals eine return-Anweisung haben, da dies andere überschreiben würde return-Aussagen bzw Exceptions.

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

Verhalten der return-Anweisung in catch und finally

Mit beiden return und throw Aussage in der finally bloc erhalten Sie die Warnung, zum Beispiel erhalten Sie dieselbe Warnung mit dem folgenden finally-Block:

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

Benutzer-Avatar
Brad Parks

Wenn Sie keine haben catch Blöcke, dann Ihre finally Blöcke müssen direkt ineinander verschachtelt werden. Es wird nur eine Ausnahme abgefangen, die es Ihrem Code ermöglicht, über das Ende eines try/catch/finally-Blocks hinaus fortzufahren. Wenn Sie die Ausnahme nicht abfangen, können Sie nach einem finally-Block keinen Code haben!

Sie können sehen, wie das funktioniert mit diesem Beispiel auf Repl.it

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;
    }

}

1225190cookie-checkEclipse-Warnung „Endlich Block wird nicht normal abgeschlossen“.

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy