Undtagelsestyper

"Jeg ville gerne tale om en ting mere i dag. I Java er alle undtagelser opdelt i to typer: markeret og umarkeret (dem der skal fanges og dem du ikke skal fange). Som standard skal alle undtagelser være fanget."

"Kan du med vilje smide undtagelser i din kode?"

"Du kan smide en hvilken som helst undtagelse i din egen kode. Du kan endda skrive dine egne undtagelser. Men det taler vi om senere. Lad os lige nu koncentrere os om undtagelser kastet af Java-maskinen."

"OKAY."

"Hvis ClassNotFoundException eller FileNotFoundException kastes (opstår) i en metode, skal udvikleren angive dem i metodedeklarationen. Disse er markerede undtagelser. Sådan ser det normalt ud:"

Eksempler på kontrollerede undtagelser
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' efterfulgt af en kommaafgrænset liste over undtagelser, ikke?"

"Ja. Men der er mere. For at programmet kan kompilere, skal metoden, der kalder method1i eksemplet nedenfor, gøre en af ​​to ting: enten fange disse undtagelser eller sende dem igen (til den, der ringer) , og angive de genudsendte undtagelser i dens erklæring. "

"Igen. Hvis din hovedmetode skal kalde en metode, hvis deklaration indeholder ' throws FileNotFoundException , ...', så skal du gøre en af ​​to ting:

1) Fang FileNotFoundException , …

Du skal indpakke koden, der kalder den usikre metode, i en try-catch- blok.

2) Fang ikke FileNotFoundException , ...

Du skal føje disse undtagelser til listen over udsendelser af din hovedmetode ."

"Kan du give mig et eksempel?"

"Tag et kig på dette:"

Eksempler på kontrollerede undtagelser
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 eksempel vil ikke kompilere, fordi hovedmetoden kalder method1() , som kaster undtagelser, der skal fanges."

"For at få det til at kompilere, skal vi tilføje undtagelseshåndtering til hovedmetoden. Du kan gøre dette på en af ​​to måder:"

Mulighed 1: Vi gengiver blot undtagelsen (til den, der 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 :"

Mulighed 2: Fang undtagelsen:
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 begynder at blive klarere."

"Se på følgende eksempel. Det vil hjælpe dig med at forstå resten."

I stedet for at håndtere undtagelser, gengiver vi dem til metoder længere nede i opkaldsstakken, som ved, hvordan de skal håndteres:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Håndter en undtagelse og smid en anden:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
Fang begge undtagelser, smid 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.");
    }
}

"Der er endnu en type undtagelse, RuntimeException og klasser, der arver den. Du behøver ikke fange dem. Disse er ukontrollerede undtagelser. De anses for at være svære at forudsige. Du kan håndtere dem på samme måde, men du behøver ikke at angive dem i en kastklausul ."