1. throw
operatør
Når et unntak fanges opp av en catch
blokk, og inntil det blir kastet til Java-maskinen, er det bare et objekt som arver Exception
(eller rettere sagt, Throwable
). Selve unntaksobjektet har ingen magiske egenskaper.
All logikken i hvordan unntak fungerer er bare en spesiell måte Java-maskinen oppfører seg på når et unntak blir kastet til den.
Du kan alltid sende et fanget unntak til Java-maskinen på nytt. For å gjøre dette må du bruke operatøren throw
:
throw exception;
Eksempel:
Kode | Konsollutgang |
---|---|
|
|
I denne koden fanget vi et unntak, viste en melding om det på skjermen, og kastet det deretter på nytt.
Et omkastet unntak kan ikke fanges opp av andre catch
blokker i samme try
blokk.
2. Dine unntak
Du kan forresten lage et unntaksobjekt selv: det er bare et objekt hvis type er Exception
eller en klasse som arver det. Og kast den.
Det er enklere enn det høres ut. Eksempel:
Kode | Konsollutgang |
---|---|
|
|
I eksemplet ovenfor opprettet vi et nytt unntaksobjekt hvis type er RuntimeException
og kastet det umiddelbart ved hjelp av throw
operatoren.
Det vil umiddelbart bli fanget opp av catch
blokken, siden RuntimeException arver Exception
. Koden catch (Exception except)
fanger opp unntaksobjekter av alle klasser som arver Exception
klassen.
3. finally
nøkkelord
Et annet viktig poeng. Noen ganger må en programmerer utføre en handling uavhengig av om et unntak skjedde i koden. Anta for eksempel at vi åpnet en fil for skriving. Den åpnede filen må lukkes ved å ringe close()
.
try
{
// Code where an exception might occur
}
catch(ExceptionType name)
{
// Exception handling code
}
finally
{
// Code that must executed no matter what happens
}
For å utføre disse obligatoriske handlingene ble en annen type blokk ( finally
) lagt til try-catch
konstruksjonen, og dermed opprettet try-catch-finally
konstruksjonen. Det ser slik ut:
Eksempel:
FileInputStream source = null;
try
{
source = new FileInputStream("c:\\note.txt");
source.read();
}
catch(Exception except)
{
System.out.println("Caught the exception");
throw except;
}
finally
{
if (source != null)
source.close();
}
Koden i finally
blokken vil kjøres uansett, uavhengig av om det var et unntak. Selv om et unntak blir kastet og ikke fanget opp, finally
vil blokkeringen fortsatt utføres.
Forresten, hvis du ikke vil fange et unntak, men du trenger en finally
blokk, bruk stenografinotasjonen for konstruksjonen try-catch-finally
: en try-finally
blokk. Det ser omtrent slik ut:
try
{
// Code where an exception might occur
}
finally
{
// Code that must executed no matter what happens
}
GO TO FULL VERSION