Tipi di eccezione

"Oggi volevo parlare di un'altra cosa. In Java, tutte le eccezioni sono divise in due tipi: controllate e non controllate (quelle che devono essere catturate e quelle che non devi catturare). Per impostazione predefinita, tutte le eccezioni devono essere preso."

"Puoi lanciare intenzionalmente eccezioni nel tuo codice?"

"Puoi lanciare qualsiasi eccezione nel tuo codice. Puoi persino scrivere le tue eccezioni. Ma ne parleremo più tardi. Adesso, concentriamoci sulle eccezioni lanciate dalla Java Machine."

"OK."

"Se ClassNotFoundException o FileNotFoundException vengono lanciate (si verificano) in un metodo, lo sviluppatore deve indicarle nella dichiarazione del metodo. Queste sono eccezioni controllate . Ecco come appare di solito:"

Esempi di eccezioni verificate
public static void method1() throws ClassNotFoundException, FileNotFoundException

public static void main() throws IOException
public static void main() // Doesn't throw any exceptions

"Quindi scriviamo solo 'lanci' seguiti da un elenco di eccezioni delimitate da virgole, giusto?"

"Sì. Ma c'è di più. Affinché il programma possa essere compilato, il metodo che chiama method1nell'esempio seguente deve fare una delle due cose: catturare queste eccezioni o rigettarle (al chiamante) , indicando le eccezioni rigettate nella sua dichiarazione. "

"Di nuovo. Se il tuo metodo principale deve chiamare un metodo la cui dichiarazione contiene ' getta FileNotFoundException , …', allora devi fare una delle due cose:

1) Cattura FileNotFoundException , …

È necessario racchiudere il codice che chiama il metodo unsafe in un blocco try-catch .

2) Non catturare FileNotFoundException , ...

È necessario aggiungere queste eccezioni all'elenco dei lanci del metodo principale ."

"Puoi farmi un esempio?"

"Guarda questo:"

Esempi di eccezioni verificate
public static void main(String[] args)
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

"Il codice in questo esempio non verrà compilato, perché il metodo principale chiama method1() , che genera eccezioni che devono essere rilevate."

"Per farlo compilare, dobbiamo aggiungere la gestione delle eccezioni al metodo principale. Puoi farlo in due modi:"

Opzione 1: Rilanciamo semplicemente l'eccezione (al chiamante):
public static void main(String[] args)  throws FileNotFoundException, ClassNotFoundException 
{
    method1();
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

"E qui lo prendiamo con un try-catch :"

Opzione 2: Cattura l'eccezione:
public static void main(String[] args)
{
    try
    {
        method1();
    }
    catch(Exception e)
    {
    }
}

public static void method1() throws FileNotFoundException, ClassNotFoundException
{
    //Throws FileNotFoundException if the file doesn't exist
    FileInputStream fis = new FileInputStream("C2:\badFileName.txt");
}

"Sta iniziando a diventare più chiaro."

"Guarda il seguente esempio. Ti aiuterà a capire il resto."

Invece di gestire le eccezioni, le rilanciamo ai metodi più in basso nello stack di chiamate che sanno come gestirle:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Gestisci un'eccezione e lanciane un'altra:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
Cattura entrambe le eccezioni, non lanciarne nessuna:
public static void method4()
{
    try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
    catch (ClassNotFoundException e)
    {
        System.out.println("ClassNotFoundException has been caught.");
    }
}

"C'è un altro tipo di eccezione, la RuntimeException e le classi che la ereditano. Non è necessario rilevarle. Queste sono eccezioni non controllate. Sono considerate difficili da prevedere. Puoi gestirle allo stesso modo, ma tu non c'è bisogno di indicarli in una clausola getta ."