Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator
Dopo oltre 4 anni si rinnova la serie Sony Alpha 7 con la quinta generazione, che porta in dote veramente tante novità a partire dai 30fps e dal nuovo sensore partially stacked da 33Mpixel. L'abbiamo provata per un breve periodo, ecco come è andata dopo averla messa alle strette.
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1
realme e Aston Martin Aramco F1 Team si sono (ri)unite dando alla vita un flagship con chip Snapdragon 8 Elite Gen 5 e design esclusivo ispirato alle monoposto di Formula 1. La Dream Edition introduce la nuova colorazione Lime Essence abbinata al tradizionale Aston Martin Racing Green, decorazioni intercambiabili personalizzate e una confezione a tema F1, intorno a uno smartphone dall'ottima dotazione tecnica con batteria da 7000mAh ricaricabile a 120W e isola fotografica intercambiabile
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum
Abbiamo partecipato all'OVHcloud Summit 2025, conferenza annuale in cui l'azienda francese presenta le sue ultime novità. Abbiamo parlato di cloud pubblico e privato, d'intelligenza artificiale, di computer quantistici e di sovranità. Che forse, però, dovremmo chiamare solo "sicurezza"
Tutti gli articoli Tutte le news

Vai al Forum
Rispondi
 
Strumenti
Old 09-04-2008, 10:30   #1
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2781
[JAVA] Quando si usa finally?

Ho capito come funziona finally però non ho trovato esempi in cui il suo utilizzo sia necessario. Sul libro che sto leggendo c'è l'esempio seguente:
Codice:
public void insertInDB(){
   try{
      cmd.executeUpdate("INSERT INTO...");
   }catch(SQLException exc){
      exc.printStackTrace();
   }finally{
      connection.close();
   }
}
Ok, con questo ho capito cosa fa finally ma non avrei potuto fare la stessa cosa così?
Codice:
public void insertInDB(){
   try{
      cmd.executeUpdate("INSERT INTO...");
   }catch(SQLException exc){
      exc.printStackTrace();
   }
   connection.close();
}
E' questo che non capisco... Grazie a chi mi illuminerà!
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 10:55   #2
khelidan1980
Senior Member
 
L'Avatar di khelidan1980
 
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
no perchè in quel caso se viene sollevata l'eccezione l'esecuzione non arriva a quel punto ma viene ritornato il controllo al main,finally serve per l'appunto in caso di eccezione viene eseguito il codice compreso nel blocco finnaly prima di ritornare il controllo al main
__________________
Khelidan
khelidan1980 è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 11:06   #3
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da khelidan1980 Guarda i messaggi
no perchè in quel caso se viene sollevata l'eccezione l'esecuzione non arriva a quel punto ma viene ritornato il controllo al main,finally serve per l'appunto in caso di eccezione viene eseguito il codice compreso nel blocco finnaly prima di ritornare il controllo al main
No, non è vero.

Codice:
class FinallyTest {
  public static void main(String[] args) {
    testFinally();
  }

  private static void testFinally() {
    try {
      System.out.println("Try...");
      throw new Exception();
    } catch (Exception ex) {
      System.out.println("Catch...");
    }
    System.out.println("Finally...");
  }
}

$> java FinallyTest 
Try...
Catch...
Finally...
In questo caso può anche scrivere come ha fatto, ma è uno stile che non consiglio per diversi motivi:
Ad esempio:
1) nel mondo reale "connection.close()" lancia anch'essa una SQLException, e va gestita.
2) nell'esempio fai solo il printStackTrace dell'eccezione...se ti accontenti va pure bene...ma in realtà quello che vuoi fare è incapsulare l'eccezione in un tipo con un livello di astrazione più alto e rilanciarla. Quindi o ti gestisci la chiusura della connessione nel 'catch' (gestendo anche l'ulteriore SQLException) o usi 'finally'.

Edit: scusate l'errore semantico...ho chiamato la classe FinallyTest e ho stampato a console "finally..." e non c'è nessuna clausola 'finally'...mah! son proprio fuso!

Ultima modifica di shinya : 09-04-2008 alle 11:10.
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 11:16   #4
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2781
Quote:
Originariamente inviato da shinya Guarda i messaggi
1) nel mondo reale "connection.close()" lancia anch'essa una SQLException, e va gestita.
2) nell'esempio fai solo il printStackTrace dell'eccezione...se ti accontenti va pure bene...ma in realtà quello che vuoi fare è incapsulare l'eccezione in un tipo con un livello di astrazione più alto e rilanciarla. Quindi o ti gestisci la chiusura della connessione nel 'catch' (gestendo anche l'ulteriore SQLException) o usi 'finally'.
1) Sì, è vero, poco più avanti nel libro aggiunge anche questa correzione, era per fare un esempio semplice.
2) Adesso ho capito e ha tutto più senso.
Grazie mille!
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 11:32   #5
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Il finally serve effettivamente solo quando serve "Propagare" l'eccezione all'esterno, senza la quale il codice sarebbe bruttino.

Scrivo pseudocodice:
Codice:
try
{
   Db.ConnectionOpen
   Db.FaiqualcosaColDatabase
   Db.Commit
}
Catch
{
   Db.RollBack
   Throw Exception all'esterno.
}
Finally
{
   Db.CloseConnection
}
In questo caso p.es. io propago l'eccezione al chiamante, ma la connessione al DB sara' correttamente chiusa in tutti i casi.
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 11:33   #6
khelidan1980
Senior Member
 
L'Avatar di khelidan1980
 
Iscritto dal: Mar 2005
Città: Morimondo city
Messaggi: 5491
Quote:
Originariamente inviato da shinya Guarda i messaggi
No, non è vero.
Già ho scritto una cavolata,son fuso pure io alle 11 di mattina mah
__________________
Khelidan
khelidan1980 è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 11:57   #7
vladix
Member
 
L'Avatar di vladix
 
Iscritto dal: Jan 2008
Città: roma
Messaggi: 296
... il finally non serve a propagare errori ... e un concetto (secondo me e forse nn solo) sbagliato , il finally racchiude un pezzo di codice che dovra essere eseguito a prescindere dal fatto che e il codice nel try ha generato o no errori , (ad esempio si vuole chiudere una connessione sia che la transazione e andata a buon fine o meno , oppure un quando si ha aperto un socket , un file ... ) perche il finally e sempre eseguito (sempre) , anche quando c'e la clausola return nel try
Codice:
  try{
   
    return;
  }catch(Exception e){

  }finnaly{

  }
nel caso nn si voglia gestire la eccezione in "questo metodo" si puo definire un blocco composto solo di try/finally
Codice:
  try{
 
    return;
  }finnaly{

  }
Quote:
Originariamente inviato da wingman87 Guarda i messaggi
Ho capito come funziona finally però non ho trovato esempi in cui il suo utilizzo sia necessario. Sul libro che sto leggendo c'è l'esempio seguente:
Codice:
public void insertInDB(){
   try{
      cmd.executeUpdate("INSERT INTO...");
   }catch(SQLException exc){
      exc.printStackTrace();
   }finally{
      connection.close();
   }
}
Ok, con questo ho capito cosa fa finally ma non avrei potuto fare la stessa cosa così?
Codice:
public void insertInDB(){
   try{
      cmd.executeUpdate("INSERT INTO...");
   }catch(SQLException exc){
      exc.printStackTrace();
   }
   connection.close();
}
E' questo che non capisco... Grazie a chi mi illuminerà!
nel primo caso la connessione verra chiusa sempre , mentre nel secondo caso solo quando il try non genera un eccezione ( in entrabi i casi dovrai cmq gestire l'eccezione generata dal metodo conection.close() )questo discorso vale nel caso tu vuoi rilanciare l'eccezione ... se no non ha molto senso il finnally xche dopo la clausola catch , il tuo programma (metodo) continuera a funzionare normalmente

Ultima modifica di vladix : 09-04-2008 alle 12:07.
vladix è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 12:07   #8
gugoXX
Senior Member
 
L'Avatar di gugoXX
 
Iscritto dal: May 2004
Città: Londra (Torino)
Messaggi: 3692
Quote:
Originariamente inviato da vladix Guarda i messaggi
... il finally non serve a propagare errori ... e un concetto (secondo me e forse nn solo) sbagliato ,
Io non ho detto che il finally serve per propagare errori.
Ho solo detto che il finally lo si usa praticamente solo quando si vogliono propagare gli errori per i quali si e' scritto il costrutto try-catch
volendo pero' ritirare correttamente le risorse.
Negli altri casi se ne puo' fare a meno, come ha anche evidenziato Shinya.

L'esempio del return in mezzo e' fuorviante. Spero che nessuno piazzi return in mezzo alle funzioni, soprattutto durante transazioni o in presenza di risorse che richiedono chiusure (file, etc.)
__________________
Se pensi che il tuo codice sia troppo complesso da capire senza commenti, e' segno che molto probabilmente il tuo codice e' semplicemente mal scritto.
E se pensi di avere bisogno di un nuovo commento, significa che ti manca almeno un test.
gugoXX è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 12:22   #9
vladix
Member
 
L'Avatar di vladix
 
Iscritto dal: Jan 2008
Città: roma
Messaggi: 296
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
i o in presenza di risorse che richiedono chiusure (file, etc.)
ma cmq il finnaly viene eseguito anche se c'e il return "in mezzo" (subito prima del return ) xcio e legale dichiarare return nel try , ( ovviamente in certi casi e proprio brutto ma quando in un metodo si esegue solo codice "pericoloso" quindi tuto chiuso nel try e il catch rilancia l'eccezione ... certo nessuno vieta mettere il return alla fine del metodo anche in questo caso , ( forse dipende anche dallo stile che uno si abitua a usare )
vladix è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 12:26   #10
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da vladix Guarda i messaggi
nel caso nn si voglia gestire la eccezione in "questo metodo" si puo definire un blocco composto solo di try/finally
Codice:
  try{
 
    return;
  }finnaly{

  }
Questa non l'ho capita. Cosa vorresti fare nel 'finally' che non puoi fare prima del 'return'?
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 12:27   #11
wingman87
Senior Member
 
Iscritto dal: Nov 2005
Messaggi: 2781
Quote:
Originariamente inviato da gugoXX Guarda i messaggi
L'esempio del return in mezzo e' fuorviante. Spero che nessuno piazzi return in mezzo alle funzioni, soprattutto durante transazioni o in presenza di risorse che richiedono chiusure (file, etc.)
In effetti prima di postare avevo notato questa possibilità del finally, ma non ne vedevo l'utilità (non che adesso la veda), quindi ho aperto questo thread.
Vi ringrazio tutti, adesso penso di aver capito a fondo l'utilità del finally.
wingman87 è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 12:31   #12
shinya
Senior Member
 
L'Avatar di shinya
 
Iscritto dal: Jul 2005
Città: Bologna
Messaggi: 1130
Quote:
Originariamente inviato da vladix Guarda i messaggi
ma cmq il finnaly viene eseguito anche se c'e il return "in mezzo" (subito prima del return ) [...CUT...]
Prima del 'return' dici?
Cosa stampa questo codice allora?

Codice:
class FinallyTest2 {
  public static void main(String[] args) {
    System.out.println(test());
  }

  private static boolean test() {
    try {
      return true;
    } finally {
      return false;
    }
  }
}
shinya è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 12:32   #13
vladix
Member
 
L'Avatar di vladix
 
Iscritto dal: Jan 2008
Città: roma
Messaggi: 296
Quote:
Originariamente inviato da shinya Guarda i messaggi
Questa non l'ho capita. Cosa vorresti fare nel 'finally' che non puoi fare prima del 'return'?
semplicemente
Codice:
  try{
    //codice pericoloso 
    return qualcosa;
  }finally{
    // codice da eseguire anche se il try lancia un eccezione (che ovviamente sara gestita ad un livello + alto)
  }
vladix è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 12:36   #14
vladix
Member
 
L'Avatar di vladix
 
Iscritto dal: Jan 2008
Città: roma
Messaggi: 296
beh , il finnaly viene sempre eseguito e quindi stampera false
Edit: e cmq nn e che o inventato io il blocco try/finnaly , io ho detto solo che legale , poi dipende dalle esigenze ( quando meno te lo aspetti puo tornare utile )

Ultima modifica di vladix : 09-04-2008 alle 12:42.
vladix è offline   Rispondi citando il messaggio o parte di esso
Old 09-04-2008, 13:28   #15
beppegrillo
Senior Member
 
L'Avatar di beppegrillo
 
Iscritto dal: Mar 2004
Messaggi: 1451
I finally lo usi per rilasciare risorse che hai acquisito, e che dovrai liberare indipendentemente dal fatto che il tuo programma ha lanciato o meno un'eccezione.
Il libro ti ha fatto l'esempio di una connessione al DB, poteva essere anche un file o qualsiasi altra cosa.
__________________
Ciao ~ZeRO sTrEsS~
beppegrillo è offline   Rispondi citando il messaggio o parte di esso
Old 11-10-2014, 16:22   #16
Samaritan
Junior Member
 
Iscritto dal: Jan 2004
Messaggi: 29
Il blocco finally{...} serve a garantire la sua esecuzione indipendentemente dal fatto che si generi un'eccezione.
E' quindi fondamentale in tutti i casi in cui si deve necessariamente rilasciare una risorsa come ad esempio una connessione ad un db od un Socket o più in generale uno Stream.
Tutti oggetti che sono implicitamente associati ad una connessione o ad un flusso di trasferimento dati.
Quando si ha a che fare con questo tipo di oggetti e non si usa un blocco finally, nel 99% dei casi si avrà a che fare con quel tipo di bug più difficili da individuare e che ti fanno bloccare tutto il programma senza neanche avere una eccezione che ti fa capire in modo chiaro la causa del blocco stesso.
Questo perché ogni volta che si usa un costrutto try...catch si lasciano al flusso di esecuzione automaticamente due sole strade tra loro mutuamente esclusive:
1-Va tutto correttamente, quindi il blocco del catch non viene proprio eseguito.
2-Si genera l'eccezione ed il blocco del catch viene eseguito, ma tutto il resto non viene eseguito perché il flusso viene bloccato dal catch e sale verso il chiamante.

Quindi se si decide di rilasciare una risorsa direttamente nel catch, questa sarà effettivamente rilasciata se e solo se si genera l'eccezione, ma se tutto va correttamente la risorsa non viene rilasciata!
Questo implica uno spazio occupato in memoria che rimarrà occupato e questo accadrà ogni volta che sarà rieseguito il codice che sta nel try senza che si generi alcuna eccezione.
Ecco perché il costrutto finally{} ci viene in aiuto e ci permette di rilasciare una risorsa sempre e comunque: sia che si generi un'eccezione e sia che vada tutto correttamente.
In generale si può esemplificare dicendo che il costrutto finally serve ogni qual volta si ha la necessità di eseguire un certo codice indipendentemente dal flusso di esecuzione.
Questa situazione si verifica sempre quando si ha a che fare con gli oggetti che ho citato prima e cioè con tutti quegli oggetti che sono intrinsecamente associati a flussi di dati che in quanto tali richiedono l'allocazione di buffer in memoria.
Credimi: se non si usa il finally con questo tipo di oggetti ci si garantisce ore ed ore e forse giorni di esaurimento nervoso per capire la causa di un blocco che prima o poi arriverà.

Ultima modifica di Samaritan : 11-10-2014 alle 21:15.
Samaritan è offline   Rispondi citando il messaggio o parte di esso
 Rispondi


Sony Alpha 7 V, anteprima e novità della nuova 30fps, che tende la mano anche ai creator Sony Alpha 7 V, anteprima e novità della ...
realme GT 8 Pro Dream Edition: prestazioni da flagship e anima racing da F1 realme GT 8 Pro Dream Edition: prestazioni da fl...
OVHcloud Summit 2025: le novità del cloud europeo tra sovranità, IA e quantum OVHcloud Summit 2025: le novità del cloud...
Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI Care e DisplayPort 2.1a Un mostro da MSI: QD-OLED WQHD a 500 Hz con AI C...
DJI Neo 2 in prova: il drone da 160 grammi guadagna il gimbal e molto altro DJI Neo 2 in prova: il drone da 160 grammi guada...
AWS rinnova lo stack dell’IA: Trainium3,...
AWS entra nell'era degli agenti: il keyn...
Roscosmos: inventario a bordo della ISS ...
Arduino viene acquisita da Qualcomm e ca...
Un razzo spaziale Arianespace Vega C ha ...
Terra Next dà il via a Scale-Up P...
Il veicolo riutilizzabile ESA Space Ride...
Un Mousepad per mirare meglio: uno youtu...
Tokyo Electron sotto accusa: Taiwan cont...
L'ESA sta cercando alternative all'utili...
iliad TOP 250 PLUS e TOP 300 PLUS: valan...
FRITZ! a Sicurezza 2025: connessioni WiF...
I 18enni di oggi non fanno più la...
Super offerte Apple: iPhone 16e a 529€ e...
Torres EVT arriva in Italia con listino ...
Chromium
GPU-Z
OCCT
LibreOffice Portable
Opera One Portable
Opera One 106
CCleaner Portable
CCleaner Standard
Cpu-Z
Driver NVIDIA GeForce 546.65 WHQL
SmartFTP
Trillian
Google Chrome Portable
Google Chrome 120
VirtualBox
Tutti gli articoli Tutte le news Tutti i download

Strumenti

Regole
Non Puoi aprire nuove discussioni
Non Puoi rispondere ai messaggi
Non Puoi allegare file
Non Puoi modificare i tuoi messaggi

Il codice vB è On
Le Faccine sono On
Il codice [IMG] è On
Il codice HTML è Off
Vai al Forum


Tutti gli orari sono GMT +1. Ora sono le: 03:20.


Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Served by www3v