"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 |
---|
|
|
|
"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 method1
i 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:"
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:"
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 :"
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."
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 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."
GO TO FULL VERSION