English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Qual è la differenza tra throw e throw new Exception(e) nel blocco catch di Java?

Exception (eccezione) è un problema che si verifica durante l'esecuzione del programma (errore di runtime). Ecco alcuni esempi di soluzioni-

  • Se la dimensione dell'array è 10 e una riga di codice tenta di accedere all'undicesimo elemento dell'array.

  • Se si tenta di dividere un numero per zero (il risultato è infinito e il JVM non sa come calcolare il suo valore).

Quando si verifica un'eccezione, il programma si interrompe improvvisamente alla riga che ha causato l'eccezione, rendendo impossibile eseguire il resto del programma. Per prevenire questo, è necessario gestire le eccezioni.

Java ha due tipi di eccezioni.

  • Eccezioni non controllate - Le eccezioni non controllate sono le eccezioni che si verificano durante l'esecuzione. Queste sono anche dette eccezioni di runtime. Includono errori di programmazione, come errori logici o utilizzi inappropriati dell'API. Le eccezioni di runtime vengono ignorate durante la compilazione.

  • Eccezioni di controllo - Le eccezioni di controllo sono le eccezioni che si verificano durante la compilazione, dette anche eccezioni di controllo. Queste eccezioni non possono essere ignorate semplicemente durante la compilazione. Gli sviluppatori devono prestare attenzione (gestire) queste eccezioni.

Gestione delle eccezioni

Per gestire le eccezioni, Java fornisce il meccanismo di blocco try-catch.

Intorno al codice che potrebbe generare un'eccezione è stato posto un blocco try / catch. Il codice nel blocco try / catch è chiamato codice protetto.

Sintassi

try {
   // Codice protetto
} catch (ExceptionName e1) {
   // Blocco catch
}

Quando un'eccezione viene sollevata all'interno del blocco try, il JVM memorizza i dettagli dell'eccezione nel stack delle eccezioni e continua a elaborare il blocco catch, invece di terminare il programma.

La dichiarazione catch coinvolge l'indicazione del tipo di eccezione che si desidera catturare. Se si verifica un'eccezione nel blocco try, si verifica il blocco catch dopo il try.

Se si elencano i tipi di eccezione che si verificano nel blocco catch, il modo in cui si passa l'eccezione al blocco catch è lo stesso del modo in cui si passano i parametri ai parametri del metodo.

Esempio

import java.io.File;
import java.io.FileInputStream;
public class Test {
   public static void main(String args[]){
      System.out.println("Hello");
      try{
         File file = new File("my_file");
         FileInputStream fis = new FileInputStream(file);
      }catch(Exception e){
         System.out.println("Non è possibile trovare il percorso del file specificato");
      }
   }
}

Risultato di output

Non è possibile trovare il percorso del file specificato

Ri-lanciare l'eccezione

Quando conserviamo un'eccezione nel blocco catch, possiamo ri-lanciarla utilizzando la parola chiave throw (usata per lanciare un'eccezione oggetto).

Quando ri-lanciamo un'eccezione, possiamo lanciarla senza doverla modificare.

try {
   int result = (arr[a]) / (arr[b]);
   System.out.println("Result of " + arr[a] + "/" + arr[b] + ": " + result);
} catch (ArithmeticException e) {
   throw e;
}

O possiamo avvolgerle in una nuova eccezione e lanciarle. Quando avvolgiamo un'eccezione in un'altra e la lanciamo, questo viene chiamato linkaggio delle eccezioni o avvolgimento delle eccezioni, e in questo modo possiamo modificare la nostra eccezione, lanciando un'eccezione di livello più alto che mantiene l'astrazione.

try {
   int result = (arr[a]) / (arr[b]);
   System.out.println("Result of " + arr[a] + "/" + arr[b] + ": " + result);
} catch (ArrayIndexOutOfBoundsException e) {
   throw new IndexOutOfBoundsException();
}

Esempio

Nell'esempio Java seguente, il codice all'interno di demoMethod() potrebbe lanciare ArrayIndexOutOfBoundsException e ArithmeticException. Queste eccezioni vengono catturate in due diversi blocchi catch.

Nel blocco catch, lanciamo due eccezioni, una delle quali viene lanciata direttamente.

import java.util.Arrays;
import java.util.Scanner;
public class RethrowExample {
   public void demoMethod() {
      Scanner sc = new Scanner(System.in);
      int[] arr = {10, 20, 30, 2, 0, 8};
      System.out.println("Array: " + Arrays.toString(arr));
      System.out.println("Choose numerator and denominator (not 0) from this array (enter positions 0 to 5)");
      int a = sc.nextInt();
      int b = sc.nextInt();
      try {
         int result = (arr[a]) / (arr[b]);
         System.out.println("Result of " + arr[a] + "/" + arr[b] + ": " + result);
      } catch (ArrayIndexOutOfBoundsException e) {
         throw new IndexOutOfBoundsException();
      } catch (ArithmeticException e) {
         throw e;
      }
   }
   public static void main(String [] args) {
      new RethrowExample().demoMethod();
   }
}

Risultato di output

Array: [10, 20, 30, 2, 0, 8]
Scegli il numeratore e il denominatore (non 0) da questo array (inserisci posizioni 0 a 5)
0
4
Exception in thread "main" java.lang.ArithmeticException: / by zero
   at myPackage.RethrowExample.demoMethod(RethrowExample.java:16)
   at myPackage.RethrowExample.main(RethrowExample.java:25)

Risultato di output

Array: [10, 20, 30, 2, 0, 8]
Scegli il numeratore e il denominatore (non 0) da questo array (inserisci posizioni 0 a 5)
124
5
Exception in thread "main" java.lang.IndexOutOfBoundsException
   at myPackage.RethrowExample.demoMethod(RethrowExample.java:17)
   at myPackage.RethrowExample.main(RethrowExample.java:23)




Ti potrebbe interessare