CodeGym /Java kurs /Java-syntax /Undantagstyper

Undantagstyper

Java-syntax
Nivå , Lektion
Tillgängliga
Undantagstyper

"Jag ville prata om en sak till idag. I Java är alla undantag uppdelade i två typer: markerade och omarkerade (de som måste fångas och de du inte behöver fånga). Som standard måste alla undantag vara fångad."

"Kan du avsiktligt kasta undantag i din kod?"

"Du kan lägga vilket undantag som helst i din egen kod. Du kan till och med skriva dina egna undantag. Men vi pratar om det senare. Låt oss just nu koncentrera oss på undantag som kastas av Java Machine."

"OK."

"Om ClassNotFoundException eller FileNotFoundException kastas (uppstår) i en metod måste utvecklaren ange dem i metoddeklarationen. Dessa är markerade undantag. Så här ser det vanligtvis ut:"

Exempel på markerade undantag
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 bara "kast" följt av en kommaavgränsad lista med undantag, eller hur?"

"Ja. Men det finns mer. För att programmet ska kunna kompileras måste metoden som anropar method1i exemplet nedan göra en av två saker: antingen fånga dessa undantag eller skicka dem igen (till den som ringer) , vilket indikerar de återställda undantagen i dess deklaration. "

"Återigen. Om din huvudmetod behöver anropa en metod vars deklaration innehåller ' throws FileNotFoundException , ...', måste du göra en av två saker:

1) Fånga FileNotFoundException , …

Du måste slå in koden som anropar den osäkra metoden i ett försöksfångstblock .

2) Fånga inte FileNotFoundException , ...

Du måste lägga till dessa undantag till kastlistan för din huvudmetod ."

"Kan du ge mig ett exempel?"

"Titta på det här:"

Exempel på markerade undantag
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 det här exemplet kommer inte att kompileras, eftersom huvudmetoden anropar method1() , vilket ger undantag som måste fångas upp."

"För att göra den kompilerad måste vi lägga till undantagshantering till huvudmetoden. Du kan göra detta på ett av två sätt:"

Alternativ 1: Vi skickar helt enkelt om undantaget (till 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");
}

"Och här fångar vi det med en try-catch :"

Alternativ 2: Fånga undantaget:
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 börjar bli tydligare.

"Titta på följande exempel. Det hjälper dig att förstå resten."

Istället för att hantera undantag skickar vi tillbaka dem till metoder längre ner i anropsstacken som vet hur de ska hanteras:
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
    method1();
}
Hantera ett undantag och kasta ett annat:
public static void method3() throws ClassNotFoundException
{
   try
    {
        method1();
    }
    catch (FileNotFoundException e)
    {
        System.out.println("FileNotFoundException has been caught.");
    }
}
Fånga båda undantagen, kasta inget:
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 finns ytterligare en typ av undantag, RuntimeException och klasser som ärver det. Du behöver inte fånga dem. Dessa är okontrollerade undantag. De anses vara svåra att förutsäga. Du kan hantera dem på samma sätt, men du behöver inte ange dem i en kastklausul."

Kommentarer
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION