Visualizzazione dei risultati da 1 a 4 su 4

Visualizzazione discussione

  1. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284
    Quote Originariamente inviata da Lodin Visualizza il messaggio
    ho bisogno di un chiarimento per quanto rigurda la gestione delle ecezioni in java.
    Se trovo un throw (new Eccezione) in un blocco finally, che succede?
    Il compilatore si ferma e da sempre e in ogni caso errore di compilazione oppure va a cercare il catch dell'eccezione nella funzione che ha richiamato la funzione che ha generato l'errore? e se tale funzione è il main?
    Facciamo prima una premessa. Un metodo ha sempre e solo UNA "ragione" di uscita. O esce normalmente con un valore di ritorno oppure esce per una eccezione lanciandola fuori.

    Due scenari abbastanza "eloquenti":

    codice:
    public static int prova() {
        try {
            return 10;
        } finally {
            throw new RuntimeException("Eccezione!");
        }
    }

    Qui (forse) penseresti che il metodo esce normalmente restituendo 10. NO. Quando arriva al return 10, questa è la prima "ragione" di uscita e la mantiene per il momento. Poi però c'è il finally che deve essere onorato. Ma il finally lancia un RuntimeException. La prima ragione di uscita (il return di 10) viene buttata via e il metodo esce quindi per la eccezione, la seconda e ultima ragione di uscita.

    Altro caso opposto:

    codice:
    public static int prova() {
        try {
            throw new RuntimeException("Eccezione!");
        } finally {
            return 10;
        }
    }

    Quando si arriva al throw .... il lancio di RuntimeException è la prima "ragione" di uscita e viene tenuta per buona per il momento. Ma idem c'è un finally che deve essere eseguito. Ma il finally restituisce 10. Quindi la prima ragione di uscita viene buttata via e il metodo ritorna con l'ultima ragione di uscita, che è la restituzione di 10.

    Quote Originariamente inviata da Lodin Visualizza il messaggio
    qui ad esempio:
    Il compilatore darà errore di compilazione ma...per quale preciso motivo?
    Nel tuo codice gli errori sono per altri motivi: le eccezioni che hai definito sono "checked" (controllate, estendono Exception).

    Per il linguaggio Java è un ERRORE tentare di catturare una eccezione checked se il compilatore deduce che nel corpo del try quella eccezione checked NON viene lanciata mai. Perché il codice del catch sarebbe codice unreachable, non raggiungibile.

    E se all'interno di un metodo viene lanciata una eccezione checked, allora DEVE essere dichiarata con il throws nella dichiarazione del metodo.
    Ultima modifica di andbin; 19-08-2016 a 17:08
    Andrea, Senior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    Java Versions Cheat Sheet

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 © 2026 vBulletin Solutions, Inc. All rights reserved.