”今天想再說一件事,在Java中,所有的異常都分為兩種:checked和unchecked(必須捕獲的和你不必捕獲的)。默認情況下,所有的異常都需要被捕捉。”
“你能故意在你的代碼中拋出異常嗎?”
“你可以在自己的代碼中拋出任何異常。你甚至可以編寫自己的異常。但我們稍後會討論這個。現在,讓我們專注於 Java 機器拋出的異常。”
“好的。”
“如果在方法中拋出(發生)ClassNotFoundException或FileNotFoundException ,開發人員必須在方法聲明中指明它們。這些是已檢查的異常。這通常是這樣的:”
檢查異常的例子 |
---|
|
|
|
“所以我們只寫‘throws’,然後是逗號分隔的異常列表,對吧?”
method1
“是的。但還有更多。為了程序要編譯,在下面的例子中調用的方法必須做兩件事之一:要么捕獲這些異常,要么重新拋出它們(給調用者),在它的聲明中指明重新拋出的異常。 ”
“再說一次。如果您的主要方法需要調用一個方法,其聲明包含‘ throws FileNotFoundException,……’,那麼您需要做以下兩件事之一:
1)趕上 FileNotFoundException,...
您必須將調用不安全方法的代碼包裝在try-catch塊中。
2)不要捕獲 FileNotFoundException,...
您必須將這些異常添加到主方法的拋出列表中。”
“你能舉個例子嗎?”
“看看這個:”
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");
}
“此示例中的代碼無法編譯,因為main方法調用method1(),它會拋出必須捕獲的異常。”
“要使其編譯,我們需要向 main 方法添加異常處理。您可以通過以下兩種方式之一執行此操作:”
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");
}
“在這裡我們用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");
}
“它開始變得更清楚了。”
“看下面的例子。它會幫助你理解其餘的。”
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.");
}
}
“還有一種類型的異常, RuntimeException和繼承它的類。 你不需要捕獲它們。這些是未經檢查的異常。它們被認為很難預測。你可以用同樣的方式處理它們,但你不需要在throws子句中指明它們。”
GO TO FULL VERSION