異常的捕獲和處理
1、處理異常的基本結構
(1)finally中的程式碼是受保護的程式碼,不論是否有異常都一定會執行
(2)以前catch中只能處理一種型別的異常,但是從jdk7開始,每個catch可以捕獲多種異常。
(3)catch中不要加空程式碼,一定有相應的異常處理程式碼,加空程式碼的話,程式是沒有任何反應,不利於除錯程式。
2、catch子句
(1)printStackTrace方法是,通過異常物件的方法,打印出相應的錯誤資訊,便於除錯,這個方法很重要。
3、finally子句
4、例項1
(1)為什麼要把in定義到try上面呢?
- in在try中初始化,因為FileInputStream可能會發生異常,所以new這行程式碼必須放在try裡面,這樣才能進行捕獲異常,read也可能發生異常,所以放到try裡面。
- finally裡可以訪問in,因為in在try外面。所以說,可以通過in.close關閉輸入流。
(2)finally中也可以用try、catch,以為close也可能丟擲異常。
(3)在實際開發中,經常會看到,有try、catch,同時,在finally中還有try、catch。
5、例項2(異常跟蹤棧)
(1)有一個類,呼叫了firstMethod方法,在firstMethod方法中呼叫了secondMethod方法,secondMethod方法中呼叫了thirdMethod方法,thirdMethod方法丟擲異常,這個異常是自定義的RuntimeException異常,丟擲異常之後,沒有處理,就拋給呼叫的方法,也就是secondMethod方法,secondMethod方法也沒有處理,就拋給呼叫的方法firstMethod方法,firstMethod方法沒有處理,,就拋給main了,main也沒有處理,就拋給虛擬機器了,但是虛擬機器也不會處理,就把異常列出了。
(2)異常報了四行錯誤,最上面的是錯誤的根,因為這一行出錯,才導致別的出現錯誤,所以,一般對根的位置改動,其餘的錯誤也就接著沒了。
(3)異常會一直拋給呼叫方,知道最原始的函式,如果最原始的函式還沒有處理的話,就會拋給虛擬機器,然後報錯。
6、父類異常不能寫在子類異常的前面
(1)Exception是所有異常的父類,但是,父類異常不能寫在子類異常前面,因為不安全
工作過程是,出現異常的話,首先回調第一個catch,看看catch能不能接受出現的異常,因為Exception是所有異常的根類,所以,所有異常都會被這個catch被捕獲掉,後面catch就沒有執行的機會了。
(2)一般是什麼異常,能處理什麼異常,就寫什麼異常,子類異常最好了。
7、方法處理異常的原則
(1)特殊情況,一個類的很多方法都丟擲一種異常,而且處理方法都一樣,這樣不需要每個異常都處理,可以每個方法都丟擲,然後統一處理,因為,為了避免程式碼重複。