Java異常處置實例剖析。本站提示廣大學習愛好者:(Java異常處置實例剖析)文章只能為提供參考,不一定能成為您想要的結果。以下是Java異常處置實例剖析正文
本文實例講述了Java異常處置的用法。分享給年夜家供年夜家參考。詳細剖析以下:
Java的異常處置機制可以贊助我們避開或許處置法式能夠產生的毛病,從而使得法式在碰到一些可恢復的毛病的時刻不會心外終止,而是行止理這些毛病,也使得我們在寫法式的時刻不用寫年夜量的代碼來檢討毛病情形,加強了代碼的可讀性和邏輯性。在Java中,異常代表一個毛病的實體對象。
異常可分為兩類;一類是嚴重毛病,如硬件毛病、內存缺乏等,它們對應著java.lang包下的Error類及其子類。平日這類毛病法式本身是沒法恢復的,須要中止法式的履行;另外一類長短嚴重的毛病,如用戶輸出了不法數據,被0除等,它們對應著java.lang包中的Exception類及其子類,這類毛病普通可以恢復,不影響法式的運轉。
我們可以用try, catch,finally症結字來捕獲異常。
1、try, catch
將能夠會產生異常的語句放到try{}塊中,然後在catch{}語句塊中捕獲便可。如被0除異常:
public class SimpleDemo { //除法運算 public static int devision(int a,int b) { return a / b; } public static void main(String[] args) { try { //5除以0 SimpleDemo.devision(5,0); System.out.println("Exception"); } catch (Exception e) { e.printStackTrace(); } System.out.println("Finish"); } }
履行成果:
可以看到,Finish被打印了出來,解釋法式並沒有由於產生了被0除的毛病而終止。
同時我們也發明,產生異常的SimpleDemo.devision()上面的System.out.println語句並沒有被履行。一旦異常產生,法式就會從以後履行的地位跳出,而不會履行異常前面的語句。
2、finally
finally語句塊中的語句不管異常有無產生都邑被履行。
有人能夠會問,既然finally塊中的語句不管異常有無產生都邑被履行,那末這個finally究竟有甚麼現實感化呢?我不消finally直接寫在裡面不可麼?
如上例,我們在catch語句塊中參加一個return:
public class SimpleDemo { //除法運算 public static int division(int a,int b) { return a / b; } public static void main(String[] args) { try { //5除以0 SimpleDemo.division(5,0); System.out.println("Exception"); } catch (Exception e) { e.printStackTrace(); return; //main函數前往 } finally { System.out.println("Finally"); } System.out.println("Finish"); } }
這時候候,finally裡面的Finish沒有被打印,而finally塊外部的Finally則被打印了出來。
finally在現實開辟中異常有效。例如我們翻開了一個數據庫,在數據庫讀寫數據的時刻產生了異常,那末這時候候就應當封閉數據庫的銜接,並釋放響應的資本。這時候候把釋放資本的代碼寫在 finally塊中是最適合不外的了。
但要留意的是,finally塊在一種情形下是不會被履行的。假如法式在履行到finally塊前加入了,如挪用System.exit()辦法,則 finally塊也就得不到履行的機遇了。
3、丟出異常
假如在一個辦法中會有異常產生,但我們不想在辦法中直接行止理這個異常,而是想讓辦法的挪用者行止理,則可使用throws症結字聲明這個辦法來丟出異常。這在Sun給我們供給的API函數中異常罕見,如java.io.Reader中的read辦法被聲明為丟出一個IOException異常:
public int read(char[] cbuf) throws IOException
這時候候我們在挪用read辦法時就必需將其放在try語句塊中停止異常捕獲,不然編譯器就會報錯,強迫我們停止異常捕獲。
固然,假如我們確切不想在挪用read的時刻處置異常,那末也能夠把挪用read辦法的辦法聲明為throws IOException,如許異常就會再次被丟出。假如我們在main函數中聲明丟出Exception異常,那末異常信息終究會被JVM捕捉處置,而JVM的處置成果是,打印出異常信息,然後終止法式的運轉。
4、異常處置的構架
一切的異常類都是從Exception類中派生而來的。這意味著,假如我們不肯定會產生甚麼類型的異常,可以直接在catch中聲明一個Exception對象,就可以捕捉到一切的Exception類及其子類的異常了。但要留意catch書寫的次序。假如在一個try前面有多個catch且第一個catch中聲明的是Exception對象,那末這個異常就會直接被第一個catch處置,前面的catch都沒法捕捉到這個異常。這類毛病在編譯的時刻就會以發生毛病。以下例:
public class CatchDemo { //除法運算 public static int division(int a,int b) { return a / b; } public static void main(String[] args) { try { CatchDemo.division(4,0); } catch(Exception e) { System.out.println("Exception Class"); } catch(ArithmeticException e) { System.out.println("ArithmeticException Class"); } } }
編譯器輸入 ArithmeticException曾經被捕捉了,意思就是說下面的Exception曾經捕捉了這個異常,不必反復捕捉。
假如把這兩個catch反過去會如何呢?
public class CatchDemo { //除法運算 public static int division(int a,int b) { return a / b; } public static void main(String[] args) { try { CatchDemo.division(4,0); } catch(ArithmeticException e) { System.out.println("ArithmeticException Class"); } catch(Exception e) { System.out.println("Exception Class"); } } }
這時候候我們發明,代碼經由過程了編譯,且履行的成果是 ArithmeticException捕捉了這個異常,爾後面的catch則沒有捕捉到。
願望本文所述對年夜家的java法式設計有所贊助。