Torna indietro   Hardware Upgrade Forum > Software > Programmazione

Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design
Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design
OnePlus 15 nasce per alzare l'asticella delle prestazioni e del gaming mobile. Ma non solo, visto che integra un display LTPO 1,5K a 165 Hz, OxygenOS 16 con funzioni AI integrate e un comparto foto con tre moduli da 50 MP al posteriore. La batteria da 7.300 mAh con SUPERVOOC 120 W e AIRVOOC 50 W è la ciliegina sulla torta per uno smartphone che promette di offrire un'esperienza d'uso senza alcun compromesso
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media
Vediamo come si comporta il Ryzen 5 7500X3D, nuovo processore di casa AMD che fonde 6 core Zen 4 con la tecnologia 3D V-Cache, particolarmente utile in scenari come il gaming. Annunciato a un prezzo di listino di 279€, il nuovo arrivato sarà in grado di diventare un riferimento per i sistemi budget? Ecco cosa ne pensiamo.
SONY BRAVIA 8 II e BRAVIA Theatre System 6: il cinema a casa in formato compatto
SONY BRAVIA 8 II e BRAVIA Theatre System 6: il cinema a casa in formato compatto
Bravia 8 II rinnova l’eredità dell’A95L con maggiore luminosità e colori più precisi. Il taglio da 55” offre un’esperienza cinematografica immersiva anche in spazi ridotti, amplificata dalla soundbar Sony Theatre System 6
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: 2780
[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: 2780
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: 2780
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


Recensione OnePlus 15: potenza da vendere e batteria enorme dentro un nuovo design   Recensione OnePlus 15: potenza da vendere e batt...
AMD Ryzen 5 7500X3D: la nuova CPU da gaming con 3D V-Cache per la fascia media AMD Ryzen 5 7500X3D: la nuova CPU da gaming con ...
SONY BRAVIA 8 II e BRAVIA Theatre System 6: il cinema a casa in formato compatto SONY BRAVIA 8 II e BRAVIA Theatre System 6: il c...
KTC H27E6 a 300Hz e 1ms: come i rivali ma a metà prezzo KTC H27E6 a 300Hz e 1ms: come i rivali ma a met&...
Cineca inaugura Pitagora, il supercomputer Lenovo per la ricerca sulla fusione nucleare Cineca inaugura Pitagora, il supercomputer Lenov...
Meta Quest 3S a un prezzo senza preceden...
Rischio per gli SSD? I driver chipset AM...
Quanto sono 'woke' le intelligenze artif...
Rockstar rilancia Red Dead Redemption su...
Blue Origin centra l'obiettivo: New Glen...
Regali di Natale spendendo poco con il B...
Windows 11/10: Microsoft chiude per semp...
Speciale CMF Nothing: smartphone, smartw...
Cooler Master presenta MasterFrame 400 M...
ChatGPT lancia le chat di gruppo collabo...
Galaxy S25 Ultra a un prezzo pazzesco: i...
Lenovo e NVIDIA GeForce RTX Serie 50: co...
be quiet! Light Base 600 LX: design pano...
Iliad Giga 200 e Giga 250 di nuovo attiv...
Black Friday arriva in anticipo: maxi ri...
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: 12:58.


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