一、概念
java中的異常是指在程序編譯、運行中產生的異常狀況,使得程序無法正常輸出結果。
二、分類
按照異常出現的時間節點,可以將其分為:
(1)檢查性異常:Java.lang.Exception
(2)運行期異常:Java.lang.RuntimeException
(3)錯誤:Java.lang.Error
以上三個類的 Java.lang.Throwable是的子孫類,其中Java.lang.Exception,Java.lang.Error是Java.lang.Throwable的子類,而Java.lang.RuntimeException則是Java.lang.Exception的子類。具體如下圖

三、深入理解
檢查性異常:程序的邏輯正確,但是由于外部的環境條件無法滿足引發的異常。例如:I/O問題,程序試圖打開一個不存在的文件,或者連接一個不存在的ip,都會報出此類錯誤。Java程序強制要求處理這類錯誤,如果不捕獲這些異常,程序將無法編譯。
舉個例子:
import java.io.FileReader;import java.net.Socket;public class Test3 { public static void main(String[] args) { // TODO Auto-generated method stub //1.打開一個不存在的文件 FileReader fr=new FileReader("d://aa.txt"); //報錯:FileNotFoundException //2.連接一個不存在的IP Socket ss = new Socket("192.168.170.55",220); //報錯: IOException }}注意:此處的兩個錯誤,不是說就一定有FileNotFound,或者沒有"192.168.170.55",220 這個端口,而是說“可能存在這樣的錯誤”,因此要拋出異常,對其處理。而且事實上我的d:/下面是有aa.txt文件的。運行期異常:是程序存在bug,例如0被除,數組越界,傳入的參數不滿足規范等。Java程序強制要求處理這類異常。
錯誤(Error):一般很少見,它可能源于程序的bug,但更可能是程序的環境問題,例如內存耗盡等,這類異常在程序中無需處理,又運行環境決定。(當然也可以嘗試修改 程序啟動時的初始內存大小)
四、異常的處理
1、在異常的發生地,直接 try …… catch……
看栗子1:
import java.io.FileReader;import java.io.IOException;import java.net.Socket;public class Test3 { public static void main(String[] args) { // TODO Auto-generated method stub //2.連接一個不存在的IP try { Socket ss = new Socket("192.168.170.55",220); } catch (IOException e) { // TODO Auto-generated catch block e.PRintStackTrace(); } System.out.println("OK"); }}在前面的Code中,直接對IOException進行了捕獲。
輸出java.net.UnknownHostException: 192.1688.170.55 at java.net.AbstractPlainSocketImpl.connect(Unknown Source) at java.net.PlainSocketImpl.connect(Unknown Source) at java.net.SocksSocketImpl.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.connect(Unknown Source) at java.net.Socket.<init>(Unknown Source) at java.net.Socket.<init>(Unknown Source) at demo.Test3.main(Test3.java:12)OK在查詢后確認沒有找到該主機后報出UnknownHostException() ,而且最后打印出OK。再看例子2:
public class Test3 { public static void main(String[] args) { // TODO Auto-generated method stub //1.打開一個不存在的文件 try { FileReader fr=new FileReader("d://abc.txt"); Socket ss = new Socket("192.1688.170.55",220); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch(IOException e2){ e2.printStackTrace(); } System.out.println("OK"); }}輸出:java.io.FileNotFoundException: d:/abc.txt (系統找不到指定的文件。) at java.io.FileInputStream.open0(Native Method) at java.io.FileInputStream.open(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileInputStream.<init>(Unknown Source) at java.io.FileReader.<init>(Unknown Source) at demo.Test3.main(Test3.java:13)OK可以看到,程序報出FileNotFoundException 之后就沒有再執行 Socket ss = new Socket("192.1688.170.55",220); ,而是直接跳出了try……catch……語句,進入到了下一句!2、finally語句塊
一般是把finally 語句塊放在try……catch……之后,在finally 語句塊中寫入必須要執行的代碼,相當于上了一個萬能險,在catch出現異常而catch 又沒有捕獲時,finally將馬上執行。
栗子:
public class Test3 { public static void main(String[] args) { // TODO Auto-generated method stub FileReader fr=null; //1.打開一個不存在的文件 try { fr=new FileReader("d://aa.txt"); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally{ try { fr.close(); } catch (IOException e) { // TODO Auto-generated catch block System.out.println("在關閉文件aa.txt時出現錯誤!"); } } System.out.println("OK"); }}在上面的code中,加入finally語句塊,fr.close 來關閉 aa文件。
而且無論前面 try ……catch……中是否出現異常,finally語句塊都會執行。
注意:以下情況下finally語句塊無法執行
(1)finally語句塊中出現異常
(2)程序所在的線程死亡
(3)前面的代碼中出現System.exit()
(4)關閉CPU
3、throws 語句
|
新聞熱點
疑難解答