Question

Eclipse give me that warning in the following 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;
    }
}

What is wrong with my code?

Was it helpful?

Solution

remove return statement from it. Final block is considered to be cleanup block, return is not generally expected in it.

OTHER TIPS

The return from finally "overrides" further exception throwing.

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

Generally a finally block should never have a return statement because it would overwrite other return-statements or Exceptions.

For further reading and more detailed answers to the backgrounds of it please see the question

Behaviour of return statement in catch and finally

With both return and throw statement in the finally bloc you will get the warning, for example, you will get the same warning with the following finally block:

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

If you don't have any catch blocks, then your finally blocks have to be nested directly inside of each other. It's only catching an exception that allows your code to continue past the end of a try/catch/finally block. If you don't catch the exception, you can't have any code after a finally block!

You can see how this works with this example on Repl.it

Example Output

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 in example at 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;
    }

}
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top