Come funziona la cattura multipla - 1

"Alcune lezioni più interessanti. Oh, quanto mi piace insegnare!"

"Vorrei parlarvi di come funzionano più blocchi catch . È molto semplice: quando si verificano eccezioni in un blocco try , l'esecuzione passa al primo blocco catch ."

"Se un tipo indicato tra parentesi del blocco catch corrisponde al tipo dell'eccezione lanciata, l'esecuzione inizia all'interno di quel blocco. Altrimenti, si passa al successivo blocco catch , dove viene eseguito lo stesso controllo."

"Se esauriamo i blocchi catch e l'eccezione non è stata rilevata, verrà rilanciata e il metodo corrente terminerà in modo anomalo."

"Capisco. Il blocco catch che coincide con il tipo di eccezione sarà quello eseguito."

"Sì, giusto. Tuttavia, in realtà è un po' più complicato. Le classi possono ereditare altre classi. Se una classe Mucca eredita una classe Animale, l'oggetto Mucca può essere referenziato non solo da una variabile Mucca, ma anche da una variabile Animale. "

"E?"

"Poiché tutte le eccezioni ereditano Exception o RuntimeException (che eredita anche Exception ), possono comunque essere rilevate utilizzando 'catch ( Exception e)' o ' catch (RuntimeException e) '."

"E?"

"Possiamo trarre due conclusioni. Primo, puoi usare 'catch (Exception e)' per catturare qualsiasi eccezione. Secondo, l'ordine dei blocchi catch è importante. "

"Ecco alcuni esempi:"

"Ciò ArithmeticExceptionche si verifica dopo che dividiamo per 0 verrà catturato nel secondo blocco catch."

Codice
try
{
    System.out.println("Before calling method1.");
    int a = 1 / 0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
    System.out.println("Division by zero. Exception has been caught.");
}
catch (Exception e)
{
    System.out.println("Any other errors. Exception has been caught.");
}

"Nell'esempio seguente, ArithmeticExceptionverrà catturato nel primo blocco catch, perché tutte le eccezioni ereditano Exception, ovvero Exceptioncopre tutte le eccezioni. "

Codice
try
{
    System.out.println("Before calling method1.");
    int a = 1/0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (Exception e)
{
    System.out.println("Any other errors. Exception has been caught.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}
catch (ArithmeticException e)
{
    System.out.println("Divided by zero. Exception has been caught.");
}

"Nell'esempio seguente, ArithmeticExceptionnon verrà rilevato. Verrà rilanciato nel metodo chiamante."

Codice
try
{
    System.out.println("Before calling method1.");
    int a = 1/0;
    System.out.println("After calling method1. This will never be shown.");
}
catch (NullPointerException e)
{
    System.out.println("Null reference. Exception has been caught.");
}

"Questo ha chiarito un po' le cose. Queste eccezioni non sono l'argomento più semplice."

"Sembra solo così. In realtà sono una delle cose più semplici in Java."

"Non so se esserne felice o triste per questo..."