'finally block does not complete normally' Eclipse warning

JavaTry Catch-Finally

Java Problem Overview


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?

Java Solutions


Solution 1 - Java

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

Solution 2 - Java

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

Solution 3 - Java

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

https://stackoverflow.com/questions/5701793/behaviour-of-return-statement-in-catch-and-finally

Solution 4 - Java

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!");
}
...

Solution 5 - Java

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

}

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionJos&#233; D.View Question on Stackoverflow
Solution 1 - JavaManMohan VyasView Answer on Stackoverflow
Solution 2 - JavaALZView Answer on Stackoverflow
Solution 3 - JavageistLichView Answer on Stackoverflow
Solution 4 - JavaAdilView Answer on Stackoverflow
Solution 5 - JavaBrad ParksView Answer on Stackoverflow