1. throwoperatør

Når et unntak fanges opp av en catchblokk, 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
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

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 catchblokker i samme tryblokk.


2. Dine unntak

Du kan forresten lage et unntaksobjekt selv: det er bare et objekt hvis type er Exceptioneller en klasse som arver det. Og kast den.

Det er enklere enn det høres ut. Eksempel:

Kode Konsollutgang
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

I eksemplet ovenfor opprettet vi et nytt unntaksobjekt hvis type er RuntimeExceptionog kastet det umiddelbart ved hjelp av throwoperatoren.

Det vil umiddelbart bli fanget opp av catchblokken, siden RuntimeException arver Exception. Koden catch (Exception except)fanger opp unntaksobjekter av alle klasser som arver Exceptionklassen.



3. finallynø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-catchkonstruksjonen, og dermed opprettet try-catch-finallykonstruksjonen. 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 finallyblokken vil kjøres uansett, uavhengig av om det var et unntak. Selv om et unntak blir kastet og ikke fanget opp, finallyvil blokkeringen fortsatt utføres.

Forresten, hvis du ikke vil fange et unntak, men du trenger en finallyblokk, bruk stenografinotasjonen for konstruksjonen try-catch-finally: en try-finallyblokk. Det ser omtrent slik ut:

try
{
   // Code where an exception might occur
}
finally
{
   // Code that must executed no matter what happens
}