it-swarm.dev

"كتلة أخيرا لا يكمل عادة" تحذير الكسوف

تعطيني Eclipse هذا التحذير في التعليمات البرمجية التالية:

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

ماخطب الرمز خاصتي؟

64
José D.

إزالة بيان الإرجاع منه. تعتبر الكتلة النهائية بمثابة كتلة تنظيف ، ولا يُتوقع أن يتم الرجوع إليها بشكل عام.

117
ManMohan Vyas

return من finally "تجاوز" رمي استثناء آخر.

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

بشكل عام ، يجب ألا تحتوي كتلة finally أبدًا على عبارة إرجاع لأنها ستستبدل عبارات return- أخرى أو Exceptions.

لمزيد من القراءة والإجابات التفصيلية لخلفياتها ، يرجى الاطلاع على السؤال

سلوك بيان العودة في الصيد وأخيرا

8
geistLich

مع كل من return و throw في الكتلة finally ستصلك التحذير ، على سبيل المثال ، سوف تحصل على نفس التحذير مع الحظر الأخير التالي:

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

إذا لم يكن لديك أي كتل catch ، فيجب أن تتداخل كتل finally داخل بعضها البعض مباشرةً. إنه يستثني فقط استثناءً يسمح لكودك بالاستمرار بعد نهاية كتلة try/catch/وأخيراً. إذا لم تلتقط الاستثناء ، فلن يكون لديك أي رمز بعد حظر أخيرًا!

يمكنك أن ترى كيف يعمل هذا مع هذا المثال على Repl.it

مثال الإخراج

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

رمز في المثال في 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