Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 12
  1. #1
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    216

    [Java] try-catch-finally

    In java devo fare quanto segue:
    Codice PHP:
    try
    {
        
    PrintWriter pw = new PrintWriter(nomeDelFile);
        
    Scanner scan = new Scanner(pw);
        ...
    }
    catch(...)
    {
         ....
    }
    catch()
    {...} 
    ora ho 2 dubbi:
    1) dove inserisco la clausola
    Codice PHP:
    finally
    {
          
    pw.close();

    2) se inserisco da qualche parte il codice con finally e, mettiamo che venga lanciata e catturata un'eccezione FileNotFoundException, non si verifica un errore in quanto pw non può invocare il metodo close()??

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [Java] try-catch-finally

    Originariamente inviato da raff5184
    1) dove inserisco la clausola
    Codice PHP:
    finally
    {
          
    pw.close();

    finally, se presente, va messo sempre dopo tutti i catch.
    Ma nota che quella variabile 'pw' l'hai dichiarato locale nel blocco del try. NON è visibile nel finally!!

    Originariamente inviato da raff5184
    2) se inserisco da qualche parte il codice con finally e, mettiamo che venga lanciata e catturata un'eccezione FileNotFoundException, non si verifica un errore in quanto pw non può invocare il metodo close()??
    Il codice nel blocco finally viene sempre eseguito, sia che venga lanciata una eccezione nel try, sia che non venga lanciata alcuna eccezione.

    Comunque ti va bene, perché close() di PrintWriter non lancia eccezioni checked.

    EDIT: anzi ... invece di chiudere il PrintWriter, dovresti chiudere lo Scanner (e nemmeno close() di Scanner lancia eccezioni checked).
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    216

    Re: Re: [Java] try-catch-finally

    Originariamente inviato da andbin
    finally, se presente, va messo sempre dopo tutti i catch.
    Ma nota che quella variabile 'pw' l'hai dichiarato locale nel blocco del try. NON è visibile nel finally!!

    Codice PHP:
    PrintWriter pw;
    try
    {
        
    pw = new PrintWriter(nomeDelFile);
        
    Scanner scan = new Scanner(pw);
        ...
    }
    catch(...)
    {
         ....
    }
    catch()
    {
        ...
    }
    finally
    {
        
    pw.close()

    che ne dici?

  4. #4
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: Re: Re: [Java] try-catch-finally

    Originariamente inviato da raff5184
    che ne dici?
    No alt .... un momento VVoVe: ... cosa centra PrintWriter con Scanner?????? Nulla.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  5. #5
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    216

    Re: Re: Re: Re: [Java] try-catch-finally

    Originariamente inviato da andbin
    No alt .... un momento VVoVe: ... cosa centra PrintWriter con Scanner?????? Nulla.
    ops... sono i soliti errori che faccio perché scrivo solo l'essenziale del codice. Ok Scanner non considerarlo

  6. #6
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Il costruttore di PrintWriter può lanciare FileNotFoundException e questo significa che 'pw' non verrebbe inizializzato.

    Il modo corretto e "difensivo" per gestire la cosa è:

    codice:
    PrintWriter pw = null;
    
    try {
        pw = new PrintWriter(nomeFile);
        ....
    } catch (IOException e) {
        ...
    } finally {
        if (pw != null) {
            pw.close();
        }
    }
    E come ripeto, ti va bene che close() non lancia eccezioni checked.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  7. #7
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    216
    Ti ringrazio..
    vorrei farti vedere ancora una cosa..
    il mio libro adotta un approccio con try innestati, perché fa questa osservazione:
    si può avere la tentazione di combinare catch e finally (credo che si riferisca al tipo di codice che mi hai fatto vedere tu) ma il codice che ne deriva è di difficile comprensione. Conviene seguire il seguente schema
    Codice PHP:
    try
    {
        
    PrintWriter pw = new PrintWriter(filename);
        try
        {
             
    //scrittura dati            ?
        
    }
        finally
        {
              
    pw.close();
        }
    }
    catch(...)
    {
          ....

    dove ho scritto "?" è perché mi chiedo se in quel try non ci sono istruzioni che possono generare eccezioni, che senso ha metterle nel try?

    PS. giusto per non evitare missunderstood non crtico il tuo codice, anzi.. sto solo cercando di capire la cosa migliore da fare

  8. #8
    non mi sembra abbia usato "due try"....ha solo dichiarato (giustamente) la variabile all'esterno del blocco try-catch perchè altrimenti nel blocco finally non sarebbe visibile.

  9. #9
    Utente di HTML.it
    Registrato dal
    Dec 2005
    Messaggi
    216
    Originariamente inviato da hurricane86
    non mi sembra abbia usato "due try"....ha solo dichiarato (giustamente) la variabile all'esterno del blocco try-catch perchè altrimenti nel blocco finally non sarebbe visibile.
    è al di fuori del try-finally ma non del try-catch

  10. #10

    POSTO QUI PERCHE' DEL TUTTO SIMILE

    Problema: dichiaro Le variabili prima del try, ma nel finally, ove le chiudo per sicurezza, provocano l'errore:
    "Utilizzo della variabile locale non assegnata"
    ?????????????????????????????????????????????????? ????????????????????


    public int DecryptTextFromFile(String FileName, byte[] Key, byte[] IV) {
    /* return 3 = ok, lettura avvenuta correttamente
    * return 1 = file vuoto o non trovato, Errore di lettura
    * return 4 = errore di crittografia
    * return 5 = errore di autorizzazione
    */

    CryptoStream cStream;
    StreamReader sReader;
    FileStream fStream;

    try
    {
    // Crea o apre il file specificato in FileName, ovvero path= ../login.txt
    fStream = File.Open(FileName, FileMode.OpenOrCreate);

    // Creo un nuovo oggetto Rijndael

    Rijndael RijndaelAlg = Rijndael.Create();
    RijndaelAlg.Key = key;
    RijndaelAlg.IV = IV;


    // Creo un CryptoStream relativo al file stream creato
    cStream = new CryptoStream(fStream,RijndaelAlg.CreateDecryptor(K ey, IV),CryptoStreamMode.Read);

    // Creo un lettore di flusso dell'oggetto CryptoStream creato
    sReader = new StreamReader(cStream);

    DataReaded = null;
    // Leggo i dati dal file per decriptarli
    DataReaded = sReader.ReadLine();
    // Ritorna 3 se la lettura e la decriptazione sono avvenute correttamente
    return 3;
    }
    catch (CryptographicException e)
    {
    // si arriva qui (e anche in errore di lettura) se nel file ci sono stringhe non
    // decriptabili con key e IV (immesse dall'utente a mano)
    MessageBox.Show("Errore di crittografia");
    this.printErrorOnFile(e, "di crittografia (decript)");
    return 4;
    }
    catch (UnauthorizedAccessException e)
    {
    MessageBox.Show("Problemi di autorizzazione");
    return 5;
    }
    catch (Exception e)
    {
    // Se il file non lo trovo o è vuoto ottengo un errore perchè fallisce il ReadLine()
    // si arriva qui (e anche in errore di crittografia) se nel file ci sono stringhe non
    // decriptabili con key e IV (immesse dall'utente a mano)
    MessageBox.Show("Errore di lettura");

    this.printErrorOnFile(e, "di lettura");

    return 1; // file non trovato o vuoto
    }
    finally
    {
    // chiudo gli stream e il file
    sReader.Close();
    cStream.Close();
    fStream.Close();
    }

    }

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.