常用到的概念有throws, throw , try, catch, finally 五個關鍵字
(底部有demo工程下載鏈接,實際操作一下,會更瞭解)
java異常分類,具體細分還有更多,詳情直接看源碼
1、throws
用來聲明方法可能會拋出什麼異常,但不對異常異性捕獲處理,也就是程序該奔潰的還是會奔潰,聲明也只是爲了提醒後來使用該方法的人,這裏有異常,用的時候要捕獲處理,不然會出問題。
使用方法:在方法名後。語法格式爲:throws 異常類型1,異常類型2…異常類型n。
例如:
public void testThrows throws IOException,SQLException{方法體}
2、throw
用來拋出一個異常,雖然方法聲明可能已經拋出異常了,但在方法執行的不同階段,可能會產生多個異常,throw的作用就是把多個不同的異常拋出來,好讓開發人員瞭解什麼時候會出現什麼類型的異常,並進行下一步處理。
使用方法:在方法體內。語法格式爲:throw 異常對象。
throw無法單用,一般要配合throws語句使用
例如和throws共用
protected void write() throws IOException,SQLException {
throw new IOException();
}
又例如和try…catch公用
protected void testThrow(){
try {
方法體
} catch (Exception e) {
throw e;
}
}
3、try,catch ,finally
一般三個一起用,或者try… catch一起用,try..finally一起用。 其中,並行的catch可以一個,也可以多個。
例如:
private static void read(String filename) {
try {
InputStream in = new FileInputStream(filename);
URL url = new URL("https://www.github.com");
} catch (FileNotFoundException e) {
System.out.println("發現異常了");
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} finally {
System.out.println("到底穿山甲說了什麼");
}
}
catch可以不斷嵌套try…catch語句
例如:
private static void read(String filename) {
try {
InputStream in = new FileInputStream(filename);
} catch (FileNotFoundException e) {
try {
InputStream ins = new FileInputStream(filename);
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
System.out.println("發現異常了");
}
}
4、哪些方法要做異常處理的?
一般IDE工具都會提示,然後按提示進行處理就行了,要麼直接throws,要麼寫try,catch處理。
通常包括:網絡http相關類,文件讀寫相關類,數據庫相關類等等
5、代碼測試
測試a
public class ExceptionTest {
public static void main(String[] args) throws FileNotFoundException {
System.out.println("準備拋出異常");
InputStream inputStream = new FileInputStream("text.txt");
System.out.println("這裏不會再執行,因爲程序已經發生異常了");
}
}
運行結果如下,直接main方法中寫InputStream方法,拋出異常
測試b
public class ExceptionTest2 {
public static void main(String[] args) throws Exception {
exception();
System.out.println("這裏不會再執行,因爲程序已經發生異常了");
}
private static void exception() throws Exception {
System.out.println("exception 準備拋出異常");
/*當屏蔽下面兩句,就不會拋出異常了*/
throw new Exception();
// InputStream inputStream = new FileInputStream("text.txt");
}
}
運行結果如下:main方法體用到了exception()方法,該方法拋出了異常,所以調用該方法的main方法也要在聲明中拋出異常,否則報錯,這時候我們可以在exception()中直接throw new Exception(); 直接拋出異常,也可以讓下面的InputStream拋出異常
測試c
public class ExceptionTest3 {
public static void main(String[] args) {
/*測試各方法實際效果,可以每次執行一個方法測試*/
exception1();
// exception2();
// exception3();
System.out.println("測試main,有異常也不怕");
}
/*用try...catch捕獲異常,並直接拋出,程序會奔潰*/
private static void exception1() {
try {
System.out.println("測試Exception1,發生在異常之前");
InputStream inputStream = new FileInputStream("text.txt");
System.out.println("測試Exception1,發生在異常之後,由於上面的句子發生異常了,所以這句不會執行,而直接跳到catch裏面了");
} catch (FileNotFoundException e) {
/*這裏已經捕獲了異常,你可以用自定義方法來處理異常,也可以不處理,
而將異常直接拋出,如果直接拋出,那麼效果和在方法聲明處 直接throws Exception是一樣的*/
System.out.println("測試Exception1,捕獲異常,並直接拋出");
e.printStackTrace();
}
}
/*用try...catch捕獲異常,進行異常處理,不拋出*/
private static void exception2() {
try {
InputStream inputStream = new FileInputStream("text.txt");
} catch (FileNotFoundException e) {
System.out.println("測試Exception2,捕獲到異常了,現在對它進行處理");
// 屏蔽下面這句,就不會拋出異常了
// e.printStackTrace();
}
}
/*多個catch語句, 還帶着finally語句的情況,若提前運行了System.exit(0),則finally不會執行*/
private static void exception3() {
try {
InetAddress inet1 = InetAddress.getByName("wwwww.163.com");
InputStream inputStream = new FileInputStream("text.txt");
System.out.println(inet1);
} catch (FileNotFoundException e) {
System.out.println("測試Exception3,捕獲到FileNotFoundException異常了,現在對它進行處理");
// e.printStackTrace();
} catch (UnknownHostException e) {
// System.out.println("發現163訪問失敗的異常,但執行了 System.exit(0);程序終止了,也不會執行後面的語句,包括finally");
// 屏蔽這句System.exit(0); 程序才能繼續運行下去
// System.exit(0);//System.exit(0);爲正常退出,非0則爲不正常退出,如System.exit(1);
System.out.println("exception3 準備拋出163訪問失敗的異常");
e.printStackTrace();
} finally {
System.out.println("finally總會執行的,除非程序突然System.exit了");
}
}
}
- 我們在main中運行exception1()方法看看,輸出如下。用try,catch捕獲異常,並且將異常直接拋出,不做任何處理
- 接下來我們註釋exception1()方法,在運行一下exception2()方法看看效果。 捕獲到異常,對它進行處理,而不拋出異常
- 最後再註釋以上方法,來運行一下exception3()方法看看。 運用了try,catch,catch,
finally語句,finally是在最後會運行的,當然還有一種情況finally不運行,就是系統提前System.exit(0);的時候
還要注意的是,雖然exception3()中的下面兩句都會引發異常
InetAddress inet1 = InetAddress.getByName("wwwww.163.com");
InputStream inputStream = new FileInputStream("text.txt");
但遇到第一個異常之後,程序就不會再處理下一句了,若還想在第一句遇到異常時,第二句還要保證執行的話,那就要用到嵌套的寫法的,在第一句catch{}中再嵌套一個try,catch結構
demo工程下載(intellij項目):
http://download.csdn.net/detail/forgot2015/9731942
參考文章,拓展閱讀:
http://blog.csdn.net/hguisu/article/details/6155636
http://lavasoft.blog.51cto.com/62575/18920/
個人能力有限,如有錯誤,懇請不吝賜教,謝謝