2013-07-05 26 views
49

Eclipse cho tôi rằng cảnh báo trong đoạn mã sau:'khối finally không hoàn thành bình thường' Eclipse cảnh báo

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

Điều gì là sai với mã của tôi?

+3

xóa trở lại -1; và nó nên được phạt – Satya

+0

@ Dennis 'cuối cùng khối không hoàn thành bình thường' ông đã viết này trong dòng chủ đề –

Trả lời

98

xóa tuyên bố trả về khỏi nó. Khối cuối cùng được coi là khối dọn dẹp, sự trở lại thường không được mong đợi trong đó.

+2

Tôi thấy, tôi nên có sự trở lại ở phần cuối của bắt ... Cảm ơn –

+2

Nhưng có bất kỳ tác hại? nếu tôi làm điều này một cách có ý thức, hãy hiểu những hậu quả? – Dhiraj

+0

Tôi nghĩ OP muốn trả về -1 khi xảy ra sự cố, trong bài đăng gốc -1 là _always_ đã trả về ... – Bamboomy

14

return từ finally "ghi đè" thêm ngoại lệ ném.

public class App { 
    public static void main(String[] args) { 
     System.err.println(f()); 
    } 
    public static int f() { 
     try { 
      throw new RuntimeException(); 
     } finally { 
      return 1; 
     } 
    } 
} 
5

chung một khối finally không bao giờ nên có một tuyên bố trở lại bởi vì nó sẽ ghi đè lên return -statements khác hoặc Exceptions.

Để biết thêm đọc và chi tiết hơn câu trả lời cho các nền tảng của nó xin vui lòng xem câu hỏi

Behaviour of return statement in catch and finally

2

Với cả hai returnthrow tuyên bố trong finally khối bạn sẽ nhận được cảnh báo, ví dụ, bạn sẽ nhận được cùng một cảnh báo với khối cuối cùng sau:

... 
}finally{ 
     throw new RuntimeException("from finally!"); 
} 
... 
Các vấn đề liên quan