Unntakstyper

"Jeg ville snakke om en ting til i dag. I Java er alle unntak delt inn i to typer: avmerket og ukontrollert (de som må fanges og de du ikke trenger å fange). Som standard må alle unntak være fanget."

"Kan du med vilje kaste unntak i koden din?"

"Du kan kaste et hvilket som helst unntak i din egen kode. Du kan til og med skrive dine egne unntak. Men vi snakker om det senere. Akkurat nå, la oss konsentrere oss om unntak kastet av Java Machine."

"OK."

"Hvis ClassNotFoundException eller FileNotFoundException blir kastet (oppstår) i en metode, må utvikleren angi dem i metodedeklarasjonen. Dette er sjekkede unntak. Slik ser det vanligvis ut:"

Eksempler på sjekkede unntak
public static void method1() throws ClassNotFoundException, FileNotFoundException

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

"Så vi skriver bare "kast" etterfulgt av en kommadelt liste over unntak, ikke sant?"

"Ja. Men det er mer. For at programmet skal kompileres, må metoden som kaller method1i eksemplet nedenfor gjøre én av to ting: enten fange opp disse unntakene eller sende dem på nytt (til den som ringer) , og angi de gjengitte unntakene i erklæringen. "

"Igjen. Hvis hovedmetoden din trenger å kalle en metode hvis erklæring inneholder ' kaster FileNotFoundException , ...', må du gjøre en av to ting:

1) Catch FileNotFoundException , …

Du må pakke inn koden som kaller den usikre metoden i en try-catch- blokk.

2) Ikke fange FileNotFoundException , ...

Du må legge til disse unntakene til listen over kast for hovedmetoden din ."

"Kan du gi meg et eksempel?"

"Se på dette:"

Eksempler på sjekkede unntak
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");
}

"Koden i dette eksemplet vil ikke kompilere, fordi hovedmetoden kaller method1() , som kaster unntak som må fanges opp."

"For å få det til å kompilere, må vi legge til unntakshåndtering til hovedmetoden. Du kan gjøre dette på en av to måter:"

Alternativ 1: Vi sender ganske enkelt unntaket på nytt (til den som ringer):
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");
}

"Og her fanger vi det med en try-catch :"

Alternativ 2: Få tak i unntaket:
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");
}

— Det begynner å bli klarere.

"Se på følgende eksempel. Det vil hjelpe deg å forstå resten."

I stedet for å håndtere unntak, kaster vi dem om til metoder lenger ned i samtalestakken som vet hvordan de skal håndtere dem:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Håndter ett unntak og kast et annet:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
Fang begge unntakene, kast ingen:
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.");
    }
}

"Det er en annen type unntak, RuntimeException og klasser som arver det. Du trenger ikke fange dem. Dette er ukontrollerte unntak. De anses som vanskelige å forutsi. Du kan håndtere dem på samme måte, men du trenger ikke angi dem i en kastklausul ."