
"Noen flere interessante leksjoner. Å, som jeg elsker å undervise!"
"Jeg vil gjerne fortelle deg om hvordan flere fangstblokker fungerer. Det er veldig enkelt: når unntak oppstår i en prøveblokk , flyttes utførelsen til den første fangstblokken ."
"Hvis en type angitt i parentesen til catch-blokken samsvarer med typen av det kastede unntaket, starter utførelsen inne i den blokken. Ellers går vi til neste catch- blokk, hvor den samme kontrollen utføres."
"Hvis vi går tom for fangstblokker og unntaket ikke er fanget, vil det bli kastet på nytt, og den nåværende metoden vil avsluttes unormalt."
"Jeg skjønner. Fangstblokken som faller sammen med unntakstypen vil være den som utføres."
"Ja, riktig. Men i virkeligheten er det litt mer komplisert. Klasser kan arve andre klasser. Hvis en Cow-klasse arver en Animal-klasse, kan Cow-objektet refereres ikke bare av en Cow-variabel, men også av en Animal-variabel. "
"Og?"
"Fordi alle unntak arver Exception eller RuntimeException (som også arver Exception ), kan de fortsatt fanges opp ved å bruke 'catch ( Exception e)' eller ' catch (RuntimeException e) '."
"Og?"
"Vi kan trekke to konklusjoner. For det første kan du bruke "fangst (unntak e)" for å fange ethvert unntak. For det andre er rekkefølgen på fangstblokkene viktig. "
"Her er noen eksempler:"
"Det ArithmeticException
som oppstår etter at vi deler med 0 vil bli fanget i den andre fangstblokken."
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.");
}
"I eksemplet nedenfor ArithmeticException
vil den bli fanget i den første catch-blokken, fordi alle unntak arver unntak, dvs. Exception
dekker alle unntak. "
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.");
}
"I eksemplet nedenfor ArithmeticException
blir den ikke fanget opp. Den vil bli kastet tilbake til anropsmetoden."
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.");
}
"Det oppklarte ting litt. Disse unntakene er ikke det enkleste temaet."
"Det virker bare slik. De er faktisk en av de enkleste tingene i Java."
"Jeg vet ikke om jeg skal være glad eller trist over det..."
GO TO FULL VERSION