"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 |
---|
|
|
|
"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 method1
i 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:"
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:"
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 :"
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."
public static void method2() throws FileNotFoundException, ClassNotFoundException
{
method1();
}
public static void method3() throws ClassNotFoundException
{
try
{
method1();
}
catch (FileNotFoundException e)
{
System.out.println("FileNotFoundException has been caught.");
}
}
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 ."
GO TO FULL VERSION