Uitzonderingstypen

"Ik wilde het vandaag nog over één ding hebben. In Java zijn alle uitzonderingen verdeeld in twee typen: aangevinkt en niet aangevinkt (degenen die moeten worden opgevangen en degenen die niet hoeven te worden opgevangen). Standaard moeten alle uitzonderingen zijn gevangen."

"Kun je opzettelijk uitzonderingen in je code gooien?"

"Je kunt elke uitzondering in je eigen code gooien. Je kunt zelfs je eigen uitzonderingen schrijven. Maar daar hebben we het later over. Laten we ons nu concentreren op uitzonderingen die door de Java-machine worden gegenereerd."

"OK."

"Als ClassNotFoundException of FileNotFoundException in een methode worden gegooid (optreden), moet de ontwikkelaar dit aangeven in de methodedeclaratie. Dit zijn gecontroleerde uitzonderingen. Zo ziet het er meestal uit:"

Voorbeelden van gecontroleerde uitzonderingen
public static void method1() throws ClassNotFoundException, FileNotFoundException

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

"Dus we schrijven gewoon 'throws' gevolgd door een door komma's gescheiden lijst met uitzonderingen, toch?"

"Ja. Maar er is meer. Om het programma te compileren, method1moet de methode die in het onderstaande voorbeeld aanroept een van de volgende twee dingen doen: ofwel deze uitzonderingen opvangen of ze opnieuw genereren (naar de aanroeper) , waarbij de opnieuw gegenereerde uitzonderingen in de verklaring worden aangegeven. "

"Nogmaals. Als je hoofdmethode een methode moet aanroepen waarvan de declaratie ' throws FileNotFoundException , …' bevat, dan moet je een van de volgende twee dingen doen:

1) Vang FileNotFoundException , …

U moet de code die de onveilige methode aanroept, verpakken in een try-catch- blok.

2) Vang FileNotFoundException niet , …

U moet deze uitzonderingen toevoegen aan de lijst met worpen van uw hoofdmethode ."

"Kun je me een voorbeeld geven?"

"Kijk hier eens even naar:"

Voorbeelden van gecontroleerde uitzonderingen
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");
}

"De code in dit voorbeeld zal niet compileren, omdat de hoofdmethode methode1() aanroept , die uitzonderingen genereert die moeten worden opgevangen."

"Om het te laten compileren, moeten we uitzonderingsafhandeling toevoegen aan de hoofdmethode. Je kunt dit op twee manieren doen:"

Optie 1: We gooien de uitzondering gewoon terug (naar de beller):
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");
}

"En hier vangen we het met een try-catch :"

Optie 2: Vang de uitzondering:
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");
}

"Het begint duidelijker te worden."

"Kijk naar het volgende voorbeeld. Het zal je helpen de rest te begrijpen."

In plaats van uitzonderingen af ​​te handelen, gooien we ze terug naar methoden verderop in de call-stack die weten hoe ze ermee moeten omgaan:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Behandel één uitzondering en gooi een andere:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
Vang beide uitzonderingen op, gooi er geen:
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.");
    }
}

"Er is nog een type exception, de RuntimeException en klassen die deze overerven. Je hoeft ze niet op te vangen. Dit zijn ongecontroleerde exceptions. Ze worden als moeilijk te voorspellen beschouwd. Je kunt ze op dezelfde manier afhandelen, maar je hoeven ze niet aan te geven in een throws- clausule."