1. throwoperatør

Når en undtagelse fanges af en catchblok, og indtil den bliver smidt til Java-maskinen, er det blot et objekt, der arver Exception(eller rettere, Throwable). Selve undtagelsesobjektet har ingen magiske egenskaber.

Al logikken i, hvordan undtagelser fungerer, er bare en speciel måde, Java-maskinen opfører sig på, når der kastes en undtagelse til den.

Du kan altid gengive en fanget undtagelse til Java-maskinen. For at gøre dette skal du bruge operatoren throw:

throw exception;

Eksempel:

Kode Konsoludgang
try
{
   int d = 2/0;
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

I denne kode fangede vi en undtagelse, viste en besked om den på skærmen og smed den derefter igen.

En omkastet undtagelse kan ikke fanges af andre catchblokke i samme tryblok.


2. Dine undtagelser

I øvrigt kan du selv oprette et undtagelsesobjekt: det er bare et objekt, hvis type er Exceptioneller en klasse, der arver det. Og smid den.

Det er nemmere end det lyder. Eksempel:

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

I eksemplet ovenfor oprettede vi et nyt undtagelsesobjekt, hvis type er, RuntimeExceptionog kastede det straks ved hjælp af throwoperatoren.

Det vil straks blive fanget af catchblokken, da RuntimeException arver Exception. Koden catch (Exception except)fanger undtagelsesobjekter af alle klasser, der arver Exceptionklassen.



3. finallysøgeord

Endnu en vigtig pointe. Nogle gange er en programmør nødt til at udføre en handling, uanset om der opstod en undtagelse i koden. Antag for eksempel, at vi åbnede en fil til skrivning. Den åbnede fil skal lukkes ved at ringe til close().

try
{
   // Code where an exception might occur
}
catch(ExceptionType name)
{
   // Exception handling code
}
finally
{
   // Code that must executed no matter what happens
}

For at udføre disse obligatoriske handlinger blev en anden slags blok ( finally) tilføjet til try-catchkonstruktionen, hvorved try-catch-finallykonstruktionen blev skabt. Det ser sådan ud:

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 køre under alle omstændigheder, uanset om der var en undtagelse. Selvom en undtagelse bliver kastet og ikke fanget, finallyvil blokeringen stadig udføres.

Forresten, hvis du ikke vil fange en undtagelse, men du har brug for en finallyblok, skal du bruge den stenografiske notation for try-catch-finallykonstruktionen: en try-finallyblok. Det ser sådan ud:

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