在昨天的文章《Java 異常的分類與處理》中我們簡單地了解了一下在方法聲明的位置上使用throws關鍵字向上拋出異常,下面深入講解異常的第一種處理方式throws。
下面深入講解異常的第一種處理方式throws。
看以下例子:
import java.io.*;
public class ExceptionTest04{
public static void main(String[] args){
m1();
}
public static void m1(){
m2();
}
public static void m2(){
m3();
}
public static void m3(){
new FileInputStream("c:/ab.txt"); //FileInputStream構造方法聲明位置上使用throws(向上拋)
}
}
以上代碼編譯時出錯:
ExceptionTest04.java:16: 錯誤: 未報告的異常錯誤FileNotFoundException; 必須對其進行捕獲或聲明以便拋出
new FileInputStream("c:/ab.txt");
按照提示修改之后:
import java.io.*;
public class ExceptionTest04{
public static void main(String[] args){
m1();
System.out.println("hello");
}
public static void m1(){
m2();
}
public static void m2(){
m3();
}
public static void m3() throws FileNotFoundException{
new FileInputStream("c:/ab.txt");
}
}
編譯時出錯;
ExceptionTest04.java:30: 錯誤: 未報告的異常錯誤FileNotFoundException; 必須對其進行捕獲或聲明以便拋出
m3();
由此看出,修改之后m3()運行時出現錯誤,上拋給m2(),以此類推,m2()上拋異常給m1(),m1()上拋異常給main()方法。
因此作出如下修改:
import java.io.*;
public class ExceptionTest04{
public static void main(String[] args) throws FileNotFoundException{
m1();
System.out.println("hello");
}
public static void m1() throws FileNotFoundException{
m2();
}
public static void m2() throws FileNotFoundException{
m3();
}
public static void m3() throws FileNotFoundException{
new FileInputStream("c:/ab.txt");
}
}
修改之后編譯通過,但是System.out.println("hello")并不會執行。
從上面的例子中可以看出,使用throws處理異常不是真正處理異常而是推卸責任,誰調用就會拋給誰。上面的m1方法如果出現了異常,因為采用的是上拋,JVM遇到這個異常就會退出JVM,之后的代碼不會執行。因此引入try...catch...方法。修改如下,編譯運行通過,并且輸出:hello。
import java.io.*;
public class ExceptionTest04{
public static void main(String[] args) throws FileNotFoundException{
try{
m1();
} catch(FileNotFoundException e){}
System.out.println("hello");
}
public static void m1() throws FileNotFoundException{
m2();
}
public static void m2() throws FileNotFoundException{
m3();
}
public static void m3() throws FileNotFoundException{
new FileInputStream("c:/ab.txt");
}
}