L'errore non blocca la funzione?

di il
9 risposte

L'errore non blocca la funzione?


package tree;

class MyExc1 extends Exception { }
class MyExc2 extends MyExc1 { }
class MyExc3 extends MyExc1 { }
public class A1 {
public static void main(String [] argv) throws Exception{
    try  
    {
        System.out.print(1);
        q();
        throw( new MyExc2() );
    }
    catch( MyExc2 h ) {
        System.out.print(2);

        }
    finally {
        System.out.print(3);
        throw( new MyExc1() );
        }
}
static void q() throws Exception{
     try {
        throw( new MyExc3() );
        }
     catch( MyExc3 k ) {
        System.out.print(4);
        throw( new MyExc3() );
        }
    catch( MyExc1 t ) {
        System.out.print(5);
        }
    finally {
        System.out.print(6);
        }
    }
}
Sera ragazzi, il codice compila e viene eseguito perfettamente restituendomi come output "1463Exception in thread "main" tree.MyExc1". Avevo un dubbio in merito: come potete vedere il programma stampa 1, poi entra nella funzione solleva Myexc3 e lo risolve, stampa 4 e poi solleva di nuovo Myexc3. Io pensavo che una volta sollevato un errore la funzione si bloccasse e portava l'errore a livello superiore dello stack, quindi al main (in questo caso); invece sembra ignorare tranquillamente l'errore Myexc3 oramai sollevato e va al finally. Dopo ritorna nel main e lì nemmeno risolve l'errore e va direttamente al finally del main che comunque non solo non risolve ma ne pone uno nuovo. In output nemmeno stampa l'errore di Myexc3 (questo è dovuto al fatto che myexc3 è una sottoclasse?)

9 Risposte

  • Re: L'errore non blocca la funzione?

    Giulio, per favore indenta sto benedetto codice, che già sei andato a tirar fuori uno degli argomenti più spinosi di Java, ci vuoi proprio male
  • Re: L'errore non blocca la funzione?

    Weierstrass ha scritto:


    Giulio, per favore indenta sto benedetto codice, che già sei andato a tirar fuori uno degli argomenti più spinosi di Java, ci vuoi proprio male
    fatto
  • Re: L'errore non blocca la funzione?

    @giulio0,
    ma le leggi le cose che ti scriviamo oppure continui a postare a casaccio???

    Il codice che hai postato FUNZIONA COSI' COME DOVREBBE FUNZIONARE!!!!
    
    D:\Java\Jdk11.0.x64\bin\java.exe -Dvisualvm.id=29192971485900 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1\lib\idea_rt.jar=54921:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1\bin" -Dfile.encoding=UTF-8 -classpath D:\Projects\java\check_main\out\production\check_main tree.A1
    1
    4
    6
    3
    Exception in thread "main" tree.MyExc1
    	at tree.A1.main(A1.java:20)
    
    Process finished with exit code 1
    
    1) INVECE di "System.out.print" USA la "System.out.println", cosi vai a capo in automatico

    2) STAI FACENDO "CASINO" con le versioni di Java che stai usando OPPURE con il tool che usi per compilare (IDE) OPPURE con l'eseguibile "java.exe" che stai usando

    PERCHE' I PROBLEMI CHE RISCONTRI NON HANNO CORRISPONDENZA CON IL CODICE CHE POSTI!

    Quindi, la domanda sorge spontanea: CHE STAI A COMBINA' ???


    E per la cronaca, il codice DOVREBBE AVERE QUESTA STRUTTURA:
    
    package tree;
    
    class MyExc1 extends Exception { }
    class MyExc2 extends MyExc1 { }
    class MyExc3 extends MyExc1 { }
    public class A1 {
        public static void main(String [] argv) throws Exception{
            try
            {
                System.out.print(1);
                q();
                throw( new MyExc2() );
            }
            catch( MyExc2 h ) {
                System.out.print(2);
    
            }
            finally {
                System.out.print(3);
                throw( new MyExc1() );
            }
        }
        static void q() throws Exception{
            try {
                throw( new MyExc3() );
            }
            catch( MyExc3 k ) {
                System.out.print(4);
                throw( new MyExc3() );
            }
            catch( MyExc1 t ) {
                System.out.print(5);
            }
            finally {
                System.out.print(6);
            }
        }
    }
    
  • Re: L'errore non blocca la funzione?

    L'unica cosa che cambio prima di incollarla dall'esercizio alla mio Netbeans è la prima riga che mi dà come errore "class is public should be declare in file named in X.java"(per risolvere premo sopra la lampadina che mi dic e "Rename file to X.java"), poi in alto inserisco "package nome_package".
  • Re: L'errore non blocca la funzione?

    migliorabile ha scritto:


    @giulio0,
    ma le leggi le cose che ti scriviamo oppure continui a postare a casaccio???

    Il codice che hai postato FUNZIONA COSI' COME DOVREBBE FUNZIONARE!!!!
    
    D:\Java\Jdk11.0.x64\bin\java.exe -Dvisualvm.id=29192971485900 "-javaagent:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1\lib\idea_rt.jar=54921:C:\Program Files\JetBrains\IntelliJ IDEA 2019.1\bin" -Dfile.encoding=UTF-8 -classpath D:\Projects\java\check_main\out\production\check_main tree.A1
    1
    4
    6
    3
    Exception in thread "main" tree.MyExc1
    	at tree.A1.main(A1.java:20)
    
    Process finished with exit code 1
    
    1) INVECE di "System.out.print" USA la "System.out.println", cosi vai a capo in automatico

    2) STAI FACENDO "CASINO" con le versioni di Java che stai usando OPPURE con il tool che usi per compilare (IDE) OPPURE con l'eseguibile "java.exe" che stai usando

    PERCHE' I PROBLEMI CHE RISCONTRI NON HANNO CORRISPONDENZA CON IL CODICE CHE POSTI!

    Quindi, la domanda sorge spontanea: CHE STAI A COMBINA' ???


    E per la cronaca, il codice DOVREBBE AVERE QUESTA STRUTTURA:
    
    package tree;
    
    class MyExc1 extends Exception { }
    class MyExc2 extends MyExc1 { }
    class MyExc3 extends MyExc1 { }
    public class A1 {
        public static void main(String [] argv) throws Exception{
            try
            {
                System.out.print(1);
                q();
                throw( new MyExc2() );
            }
            catch( MyExc2 h ) {
                System.out.print(2);
    
            }
            finally {
                System.out.print(3);
                throw( new MyExc1() );
            }
        }
        static void q() throws Exception{
            try {
                throw( new MyExc3() );
            }
            catch( MyExc3 k ) {
                System.out.print(4);
                throw( new MyExc3() );
            }
            catch( MyExc1 t ) {
                System.out.print(5);
            }
            finally {
                System.out.print(6);
            }
        }
    }
    
    Si in questo caso ho corretto gli errori di compilazione di questo codice per "sollevare" la mia domanda. Comunque la luna sarebbe la domanda: un errore può essere ignorato ed andare al finally per poi essere propagato nella funzione chiamante?
  • Re: L'errore non blocca la funzione?

    Che cosa intendi per la luna? Boh!
    Vabbe' sara un errore di battitura.
    un errore può essere ignorato ed andare al finally per poi essere propagato nella funzione chiamante?
    Ora, tu stai chiedendo SE E' VERO che quello che stai OSSERVANDO e' il COMPORTAMENTO CORRETTO nell'esecuzione del codice.

    E' OVVIO CHE E' IL CORRETTO COMPORTAMENTO!

    Poiche' TU NON SEI il progettista della Virtual Machine Java, LA VERITA" e' data dal COMPORTAMENTO DELLA VM, QUALUNQUE esso sia ed anche se a te non piace o non lo capisci.

    QUINDI, quello che devi fare e' CAPIRE perche' non si comporta nel modo in cui tu ti aspettavi!

    E questo lo si fa INNANZITUTTO STUDIANDO.

    E' poco utile continuare a chiedere cose al forum SE TI MANCANO LE BASI.
    Quello che stai chiedendo sono TUTTE COSE che trovi nel relativo paragrafo DI QUALUNQUE LIBRO (semi decente) su Java.

    Tu penserai: sei stato piu' tempo a scrivere la risposta che non a rispondere alla domanda.

    E' VERO. Ma quello che stiamo cercando di farti capire e' che LE COSE PRIMA SI STUDIANO POI SI PROVANO, e se non si capisce SI RITORNA A STUDIARE.

    Se poi non si cava un ragno dal buco, siamo qui' per aiutare.
  • Re: L'errore non blocca la funzione?

    migliorabile ha scritto:


    Che cosa intendi per la luna? Boh!
    Vabbe' sara un errore di battitura.
    un errore può essere ignorato ed andare al finally per poi essere propagato nella funzione chiamante?
    Ora, tu stai chiedendo SE E' VERO che quello che stai OSSERVANDO e' il COMPORTAMENTO CORRETTO nell'esecuzione del codice.

    E' OVVIO CHE E' IL CORRETTO COMPORTAMENTO!

    Poiche' TU NON SEI il progettista della Virtual Machine Java, LA VERITA" e' data dal COMPORTAMENTO DELLA VM, QUALUNQUE esso sia ed anche se a te non piace o non lo capisci.

    QUINDI, quello che devi fare e' CAPIRE perche' non si comporta nel modo in cui tu ti aspettavi!

    E questo lo si fa INNANZITUTTO STUDIANDO.

    E' poco utile continuare a chiedere cose al forum SE TI MANCANO LE BASI.
    Quello che stai chiedendo sono TUTTE COSE che trovi nel relativo paragrafo DI QUALUNQUE LIBRO (semi decente) su Java.

    Tu penserai: sei stato piu' tempo a scrivere la risposta che non a rispondere alla domanda.

    E' VERO. Ma quello che stiamo cercando di farti capire e' che LE COSE PRIMA SI STUDIANO POI SI PROVANO, e se non si capisce SI RITORNA A STUDIARE.

    Se poi non si cava un ragno dal buco, siamo qui' per aiutare.
    Si concordo. Quindi i miei dubbi sono corretti? Poiché l'errore Myexc3 è sottoclasse di Myexc1 allora non viene stampato? Quindi un errore può essere ignorato e si passa al finally?
  • Re: L'errore non blocca la funzione?

    Ok, ora è più chiaro.

    Alcuni consigli sparsi.

    1) studiati bene il try-catch-finally e le eccezioni, come ti è stato detto. Non è un argomento che si può affrontare senza studio, in particolare in Java dove poi c'è la rogna ulteriore delle checked exceptions

    2) Leggiti sempre tutti i warnings di NetBeans, non sono lì per bellezza. Il punto 5, ad esempio, non è mai raggiungibile e NetBeans ti spiega perché

    3) impara a usare il Debug, con breakpoint e utilizzo dei tasti F7 e F8 per eseguire le istruzioni, così vedi in diretta quale sia l'ordine delle chiamate, cosa che ti aiuta tantissimo anche durante lo studio
  • Re: L'errore non blocca la funzione?

    giulio0 ha scritto:


    Quindi i miei dubbi sono corretti? Poiché l'errore Myexc3 è sottoclasse di Myexc1 allora non viene stampato? Quindi un errore può essere ignorato e si passa al finally?
    Nel punto di q():
         catch( MyExc3 k ) {
            System.out.print(4);
            throw( new MyExc3() );
            }
    Viene lanciata una nuova eccezione MyExc3. Questa NON può essere gestita nel try-catch-finally di q, deve per forza uscire fuori dal metodo q(). C'è un finally, quindi questo comunque viene sempre "onorato". Per cui dopo aver stampato 4, stampa 6 e infine q() esce per eccezione.

    Ora: nel main c'è un catch, può catturare MyExc3? La risposta è semplice: NO. Perché il catch cattura MyExc2 che non ha alcuna relazione con MyExc3.
    Quindi anche qui MyExc3 in "teoria" dovrebbe uscire fuori dal main.
    MA c'è un ma. C'è un finally, questo viene sempre onorato. Quindi stampa 3. Ma poi c'è il lancio di MyExc1. Devi SEMPRE ricordare una cosa: un metodo ha solo UNA "ragione" di uscita. O esce con un valore di ritorno o esce "brutalmente" con UNA eccezione. Non può uscire per due motivi contemporaneamente!

    Dal momento che il main lancia MyExc1, la eccezione MyExc3 che stava uscendo dalla invocazione di q() viene di fatto DIMENTICATA. E quindi si esce dal main lanciando fuori MyExc1, questo è il motivo della stampa finale "Exception in thread "main" tree.MyExc1"
Devi accedere o registrarti per scrivere nel forum
9 risposte