Visualizzazione dei risultati da 1 a 3 su 3
  1. #1
    Utente di HTML.it
    Registrato dal
    Mar 2010
    Messaggi
    68

    Blocchi try-finally annidati

    Dato il seguente codice:
    codice:
    public class Test {
    	public static void test() throws ArrayStoreException, ArithmeticException, InterruptedException {
    		try {
    			//...
    			try {
    				//...
    				try {
    					//...
    				} finally {
    					System.out.println("inner-inner-finally");
    					throw new InterruptedException();
    				}	
    			} finally {
    				System.out.println("inner-finally");
    				throw new ArrayStoreException();
    			}	
    		} finally {
    			System.out.println("finally");
    			throw new ArithmeticException();
    		}	
    	}	
    	
    	public static void main(String[] args) {
    		try {
    			test();
    		} catch (ArrayStoreException e) {
    			System.out.println("main -> exception: ArrayStoreException");
    		} catch (InterruptedException e) {
    			System.out.println("main -> exception: InterruptedException");
    		} catch (ArithmeticException e) {
    			System.out.println("main -> exception: ArithmeticException");
    		}
    	}
    }
    Ed il seguente output:
    codice:
    inner-inner-finally
    inner-finally
    finally
    main -> exception: ArithmeticException
    Vorrei capire che cosa ne è delle due eccezioni lanciate all'interno dei due finally annidati. L'output lascia intendere che vengano "scordati", però in che modo e secondo quale logica?

    P.S. Le classi delle eccezioni le ho scelte casualmente con il solo fine che fossero una diversa dalle altre.

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

    Re: Blocchi try-finally annidati

    Originariamente inviato da M@P
    Vorrei capire che cosa ne è delle due eccezioni lanciate all'interno dei due finally annidati. L'output lascia intendere che vengano "scordati", però in che modo e secondo quale logica?
    Ogni metodo ha solo 1 "ragione" di uscita. E in casi in cui durante il flusso del metodo vengano eseguite più operazioni che causano un certo motivo di uscita, l'ultimo è quello preso in considerazione mentre gli altri semplicemente vengono "scordati".

    Succederebbe anche con:

    codice:
    public static int test() {
        try {
            throw new ArithmeticException();
        } finally {
            return 10;
        }
    }
    Così sembrerebbe che il metodo debba uscire per la eccezione. No, ritorna semplicemente 10 senza lanciare di fuori alcuna eccezione. La ArithmeticException viene "scordata" perché nel finally si imposta una nuova ragione di uscita che è il ritorno di 10.

    Sono questioni un po' "trabocchetto" (e se si fanno i test per una certificazione come la SCJP possono anche saltare fuori ). Ma non c'è moltissimo da capire, basta seguire il flusso e tenere per buona l'ultima ragione di uscita sapendo che le altre vengono scordate.
    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
    Mar 2010
    Messaggi
    68

    Re: Re: Blocchi try-finally annidati

    Originariamente inviato da andbin Sono questioni un po' "trabocchetto" (e se si fanno i test per una certificazione come la SCJP possono anche saltare fuori ). Ma non c'è moltissimo da capire, basta seguire il flusso e tenere per buona l'ultima ragione di uscita sapendo che le altre vengono scordate.
    Io, per l'appunto lo chiedo perchè sono intenzionato in futuro a prendere la certificazione SCJP, comunque ti ringrazio della ottima spiegazione, adesso mi è tutto più chiaro.

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.