Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it L'avatar di wino_7
    Registrato dal
    Dec 2006
    Messaggi
    537

    Interpretazione eccezione, non capisco

    Salve a tutti non riesco a capire perchè la terza chiamata genera un excep di tipo exception2.

    Codice PHP:
    class Exception1 extends Exception {}
    class 
    Exception2 extends Exception {}

    public class 
    Test {

        static 
    int method(String xthrows Exception1Exception2 {

            try {
                if (
    x.equals("aabbcc")) {
                    return 
    0;
                }

                if (
    x.length() < 9) {
                    return 
    method("a" "c");
                }

                throw new 
    Exception2();
            }

            catch(
    Exception1 e) {
                throw new 
    Exception2();
            }

            catch(
    Exception2 e) {
                throw new 
    Exception1();
            }
        }

        public static 
    void main(String[] argsthrows Exception1Exception2 {
            
    System.out.println(Test.method("a"));
            
    System.out.println(Test.method("bb"));
            
    System.out.println(Test.method("ccc"));
        }



  2. #2
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    In realtà ti genera una Exception1 (tra l'altro, che senso ha rilanciare le eccezioni "incrociandole"?) e lo fa già nella prima chiamata delle tre del main(): il metodo method() è ricorsivo, finchè la lunghezza della stringa parametro rimane minore di lunghezza 9 cicla appendendo "a" all'inizio e "c" alla fine; non appena diventa più lunga di 9 caratteri ti genera l'eccezione

    codice:
    throw new Exception2();

  3. #3
    Utente di HTML.it L'avatar di wino_7
    Registrato dal
    Dec 2006
    Messaggi
    537
    In realtà non ha nessun senso è solo un esercizio d'esame fatto apposta per rompere ****** .

    La cosa che non capisco è che viene sollevata sia nella prima chiamata sia nella terza una new Exception2 il cui gestore rilancia la Exception1.

    Allora perchè nel primo caso il risultato è Exception2 e nel terzo è Exeption1????

  4. #4
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Ah, giusto, non ci avevo fatto caso...

    Perchè la Exception1 genera una Exception2, che viene catchata nel secondo "catch"

  5. #5
    Utente di HTML.it L'avatar di wino_7
    Registrato dal
    Dec 2006
    Messaggi
    537
    Continuo a non capire.

    Se nella clausola try viene generata una Exception questa sarà in ogni caso una Exception2() a cui è associato un gestore che a sua volta rilancia una Exception1().

    La cosa strana è che se la prima e la terza chiamata sollevano tutte e due una Exception2() allora perchè il risultato della prima è una Exception1 e il risultato della terza è Exception2 ????

  6. #6
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Colpa delle chiamate ricorsive:
    - se entri nel metodo method() n-dispari volte, l'eccezione in uscita sarà Exception1
    - se entri nel metodo method() n-pari volte, l'eccezione in uscita sarà Exception2

    Lo puoi comodamente verificare così:
    codice:
    catch(Exception1 e)
    {
      System.out.println("1");
      throw new Exception2();
    }
    catch(Exception2 e)
    {
      System.out.println("2");
      throw new Exception1();
    }

  7. #7
    Utente di HTML.it L'avatar di wino_7
    Registrato dal
    Dec 2006
    Messaggi
    537
    Mamma mia e dove è uscito ora il controllo che "VEDE" il pari e dispari ???

    Io non vedo nulla del genere, a me sembra di capire che da method si esce solo in 2 modi o con return 0 oppure con throw new Exception2();

    A sua volta throw new Exception2(); viene gestita e solleva una throw new Exception1(); che anch'essa viene gestita sollevando una throw new Exception2();

    A questo punto noto una cosa che non avevo notato :

    se il gestore di Exception2 lancia una Exception1 ed il gestore di Exception1 lancia una Exception2 non dovremmo causare una ricorsione infinita???

    Invece non succede.

  8. #8
    Utente di HTML.it L'avatar di desa
    Registrato dal
    Oct 2008
    Messaggi
    569
    Mi sono spiegato male, ma in realtà la questione del pari o dispari è implicita.
    Quando generi una eccezione (throw new Exception()), se questa non gestita più avanti esci immediatamente dal metodo. Dove vai a finire? Naturalmente nel punto del codice dove avevi chiamato quel metodo. Se hai una chiamata ricorsiva sei in una situazione di questo tipo:
    - main()
    - method() (prima volta)
    - method() (seconda volta)
    - method() (terza volta)

    Se nel method() (terza volta) genera una eccezione "salterai" nel suo chiamante, cioè method() (seconda volta), il quale gestirà l'eccezione rilanciandola a method() (prima volta), il quale la gestirà rilanciandola al main(), che uscirà segnalandoti l'errore.
    Analizza questa sequenza, e ti renderai conto che vengono lanciate Exception1 e Exception2 in maniera alternata.

    Sono di corsa, se non hai ancora le idee chiare (la ricorsione sa essere infida) segnalamelo e proverò a essere più dettagliato

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.