1. throwoperatore

Quando un'eccezione viene rilevata da un catchblocco e fino a quando non viene lanciata alla macchina Java, è solo un oggetto che eredita Exception(o meglio, Throwable). L'oggetto eccezione stesso non ha proprietà magiche.

Tutta la logica di come funzionano le eccezioni è solo un modo speciale in cui la macchina Java si comporta quando viene lanciata un'eccezione.

È sempre possibile rilanciare un'eccezione rilevata alla macchina Java. Per fare ciò, è necessario utilizzare l' throwoperatore:

throw exception;

Esempio:

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

In questo codice, abbiamo rilevato un'eccezione, visualizzato un messaggio a riguardo sullo schermo e quindi rilanciato.

Un'eccezione rilanciata non può essere rilevata da altri catchblocchi nello stesso tryblocco.


2. Le tue eccezioni

A proposito, puoi creare tu stesso un oggetto eccezione: è solo un oggetto il cui tipo è Exceptiono una classe che lo eredita. E buttalo.

È più facile di quanto sembri. Esempio:

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

Nell'esempio sopra, abbiamo creato un nuovo oggetto eccezione il cui tipo è RuntimeExceptione lo abbiamo lanciato immediatamente usando l' throwoperatore.

Verrà immediatamente catturato dal catchblocco, poiché RuntimeException eredita Exception. Il catch (Exception except)codice rileva gli oggetti eccezione di tutte le classi che ereditano la Exceptionclasse.



3. finallyparola chiave

Un altro punto importante. A volte un programmatore deve eseguire un'azione indipendentemente dal fatto che si sia verificata un'eccezione nel codice. Ad esempio, supponiamo di aver aperto un file per la scrittura. Il file aperto deve essere chiuso chiamando close().

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

Per eseguire queste azioni obbligatorie, finallyè stato aggiunto un altro tipo di blocco ( ) al try-catchcostrutto, creando così il try-catch-finallycostrutto. Sembra così:

Esempio:

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();
}

Il codice nel finallyblocco verrà eseguito in ogni caso, indipendentemente dal fatto che si sia verificata un'eccezione. Anche se viene generata un'eccezione e non viene rilevata, il finallyblocco verrà comunque eseguito.

A proposito, se non vuoi catturare un'eccezione, ma hai bisogno di un finallyblocco, usa la notazione abbreviata per il try-catch-finallycostrutto: un try-finallyblocco. Assomiglia a questo:

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