程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> Java異常處置實例剖析

Java異常處置實例剖析

編輯:關於JAVA

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法式設計有所贊助。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved