2013-07-05 10 views
49

Eclipse dammi questo avvertimento nel seguente codice:'blocco finally non si completa normalmente' Eclipse avvertimento

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

Cosa c'è di sbagliato con il mio codice?

+3

rimuovere return -1; e dovrebbe andare bene – Satya

+0

@Dennis 'il blocco finale non viene completato normalmente' ha scritto questo argomento nell'oggetto –

risposta

98

rimuovere la dichiarazione di ritorno da esso. Il blocco finale è considerato come blocco di pulizia, in genere non è previsto il ritorno.

+2

Vedo, dovrei avere il ritorno alla fine del fermo ... Grazie –

+2

Ma c'è qualche danno? se lo faccio coscientemente, comprendo le ripercussioni? – Dhiraj

+0

Penso che OP volesse restituire -1 quando qualcosa è andato storto, nel post originale -1 è _always_ restituito ... – Bamboomy

14

Il return da finally "sostituisce" l'ulteriore lancio di eccezioni.

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

Generalmente un blocco finally non dovrebbe mai avere una dichiarazione di ritorno perché sarebbe sovrascrivere altri return -statements o Exceptions.

per ulteriori letture e più dettagliate risposte alle sfondi di esso si prega di vedere la questione

Behaviour of return statement in catch and finally

2

Con entrambi return e throw economico nel finally bloc si otterrà l'avviso, ad esempio, si vuole ottenere lo stesso avviso con il seguente blocco finally:

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