web-dev-qa-db-fra.com

"Enfin, le blocage ne se termine pas normalement"

Eclipse me donne cet avertissement dans le code suivant:

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

Quel est le problème avec mon code? 

60
José D.

enlever la déclaration de retour de celui-ci . Le bloc final est considéré comme un bloc de nettoyage, le retour n’est généralement pas attendu.

115
ManMohan Vyas

La return de finally "annule" le lancement d'une exception 

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

20
ALZ

Généralement, un bloc finally ne devrait jamais avoir une instruction return car il écraserait d'autres instructions return- ou Exceptions.

Pour plus de précisions et des réponses plus détaillées sur le contexte, veuillez vous reporter à la question.

Comportement de l'instruction return dans catch et enfin

7
geistLich

Avec les deux instructions return et throw dans le bloc finally, vous obtiendrez l'avertissement. Par exemple, vous obtiendrez le même avertissement avec le bloc enfin suivant:

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

Si vous n'avez aucun bloc catch, vos blocs finally doivent être imbriqués directement l'un dans l'autre. Il ne détecte qu'une exception qui permet à votre code de continuer au-delà de la fin d'un bloc try/catch/finally. Si vous ne détectez pas l'exception, vous ne pouvez plus avoir de code après un blocage final!

Vous pouvez voir comment cela fonctionne avec cet exemple sur Repl.it

Exemple de sortie

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 dans l'exemple sur 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;
    }

}
0
Brad Parks