1. throwoperatör

När ett undantag fångas av ett catchblock, och tills det kastas till Java-maskinen, är det bara ett objekt som ärver ( Exceptioneller snarare, Throwable). Själva undantagsobjektet har inga magiska egenskaper.

All logik i hur undantag fungerar är bara ett speciellt sätt som Java-maskinen beter sig när ett undantag kastas till den.

Du kan alltid kasta om ett fångat undantag till Java-maskinen. För att göra detta måste du använda throwoperatorn:

throw exception;

Exempel:

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

I den här koden fångade vi ett undantag, visade ett meddelande om det på skärmen och kastade det sedan om.

Ett omkastat undantag kan inte fångas upp av andra catchblock i samma tryblock.


2. Dina undantag

Förresten, du kan skapa ett undantagsobjekt själv: det är bara ett objekt vars typ är Exceptioneller en klass som ärver det. Och kasta den.

Det är lättare än det låter. Exempel:

Koda Konsolutgång
try
{
   throw new RuntimeException();
}
catch(Exception except)
{
   System.out.println("Caught the exception");
   throw except;
}
Caught the exception

I exemplet ovan skapade vi ett nytt undantagsobjekt vars typ är RuntimeExceptionoch kastade det omedelbart med throwoperatorn.

Det kommer omedelbart att fångas av catchblocket, eftersom RuntimeException ärver Exception. Koden catch (Exception except)fångar undantagsobjekt av alla klasser som ärver Exceptionklassen.



3. finallynyckelord

En annan viktig punkt. Ibland måste en programmerare utföra någon åtgärd oavsett om ett undantag inträffade i koden. Anta till exempel att vi öppnade en fil för att skriva. Den öppnade filen måste stängas genom att anropa close().

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

finallyFör att utföra dessa obligatoriska åtgärder lades en annan typ av block ( ) till try-catchkonstruktionen, vilket skapade try-catch-finallykonstruktionen. Det ser ut så här:

Exempel:

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 finallyblocket kommer att köras i alla fall, oavsett om det fanns ett undantag. Även om ett undantag kastas och inte fångas, finallykommer blockeringen fortfarande att utföras.

Förresten, om du inte vill fånga ett undantag, men du behöver ett finallyblock, använd förkortningen för try-catch-finallykonstruktionen: ett try-finallyblock. Det ser ut ungefär så här:

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