"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 |
---|
|
|
|
"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 method1
i 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:"
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:"
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 begynner å bli klarere.
"Se på følgende eksempel. Det vil hjelpe deg å 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.");
}
}
"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 ."
GO TO FULL VERSION