JAVA學習之 異常處理機制
今天就來說說java的異常處理機制,異常處理不是第一接觸,尤其是寫過很多c#的程式碼,基本都會寫到異常處理的程式碼,其實c#的異常處理與java的異常處理基本都是一樣的,只是在一些細節上不是很一樣。今天就來說說關於Java的異常處理機制。
一、為什麼需要
1、原因很簡單就是錯誤是無法避免的,為什麼這麼說:我們的程式都是需要與外界互動的,但是外界環境是沒有辦法控制的,例如要訪問的檔案不存在,突然網路中斷,或者操作失誤等等都在所難免。還有程式碼是程式設計師寫出來的,有bug也在情理之中。
2、異常無法避免,但是一個好的系統不能再遇到異常的時候就癱瘓吧?!我們需要對使用者提出友好的提示,並且對使用者的操作進行儲存。這樣異常處理就是非常必要的了。
首先說道異常,我們都知道在寫程式的時候異常在所難免,但是這些異常都是怎麼造成的呢?!總結髮現異常一般是由使用者錯誤引起,程式錯誤引起,物理錯誤引起。
二、優勢
1、傳統的方法會將很多精力用在錯誤處理上,如果用異常處理我們可以先完成正常的流程,再對異常進行捕捉處理
2、傳統的方法正常流程和異常混在一起,而異常處理則是互相獨立的,增強了程式碼的可讀性。
3、傳統的方法使用分支語句來處理錯誤,增加了程式碼的複雜性,如果用異常處理的方法則對異常型別進行分型別分組別進行處理簡單明瞭
4、傳統的方法只能對考慮到的錯誤進行處理,對無法預測的錯誤沒有應對措施,如果用異常處理的方式則對各種異常都能進行處理
三、分類
1、Throwable(java.lang.Throwable):在API文件中寫到:Throwable 類是 Java 語言中所有錯誤或異常的超類。只有當物件是此類(或其子類之一)的例項時,才能通過 Java 虛擬機器或者Java throw 語句丟擲。類似地,只有此類或其子類之一才可以是 catch 子句中的引數型別。
2、Error(java.lang.Error):我們都知道是錯誤的意思,用於指示合理的應用程式不應該試圖捕獲的嚴重問題
3、Exception(java.lang.Exception):異常是指程式本身可以處理的異常
4、RuntimeException(java.lang.RuntimeException
5、非執行時異常(編譯異常):是runtimeException以外的異常,從程式的角度講是必須進行處理的異常,如果不處理,程式就不能編譯通過。例如:sqlException以及自定義的Exception異常。
四、異常機制
在java中兩種方法處理異常:捕捉異常,丟擲異常。
1、捕捉異常:
使用try...catch捕獲異常並處理,多個catch語句用來匹配多個異常,如:
程式碼如下:
package com.tgb.pattern;
import javax.swing.JOptionPane;
public class Demo {
public static void main(String[] args){
int i=Integer.parseInt(JOptionPane.showInputDialog("請輸入一個整數"));
JOptionPane.showMessageDialog(null,"輸入的整數是:"+ i);
}
}
如果輸入qq就會出現:
調整後:
package com.tgb.pattern;
import javax.swing.JOptionPane;
public class Demo {
public static void main(String[] args){
try{
int i=Integer.parseInt(JOptionPane.showInputDialog("請輸入一個整數"));
JOptionPane.showMessageDialog(null,"輸入的整數是:"+ i);
}catch(NumberFormatException nf){
JOptionPane.showMessageDialog(null,nf.getMessage());
}
}
}
結果為:
這樣使用者還是沒有辦法看明白,繼續修改:
package com.tgb.pattern;
import javax.swing.JOptionPane;
public class Demo {
public static void main(String[] args){
try{
int i=Integer.parseInt(JOptionPane.showInputDialog("請輸入一個整數"));
JOptionPane.showMessageDialog(null,"輸入的整數是:"+ i);
}catch(NumberFormatException nf){
JOptionPane.showMessageDialog(null,"只能輸入整數!");
}
}
}
結果為:
再看一個多個catch的程式碼:
package com.tgb.pattern;
import javax.swing.JOptionPane;
public class Demo {
public static void main(String[] args){
try{
int i=Integer.parseInt(JOptionPane.showInputDialog("請輸入一個整數,範圍是0-10:"));
JOptionPane.showMessageDialog(null,"輸入的數為:" +getIntDigit(i));
}catch(Exception ex){
JOptionPane.showMessageDialog(null,ex.getMessage());
}
}
static int getIntDigit(int i)throws Exception{
if(i>0 && i<=10){
return i;
}else{
throw new Exception("輸入數的範圍不在0-10之間");
}
}
}
結果為:
沒能不為整數的資料進行異常處理,下面修改一下:
package com.tgb.pattern;
import javax.swing.JOptionPane;
public class Demo {
public static void main(String[] args){
try{
int i=Integer.parseInt(JOptionPane.showInputDialog("請輸入一個整數,範圍是0-10:"));
JOptionPane.showMessageDialog(null,"輸入的數為:" +getIntDigit(i));
}catch(NumberFormatException nf){
JOptionPane.showMessageDialog(null, "必須輸入整數");
}catch(Exception ex){
JOptionPane.showMessageDialog(null,ex.getMessage());
}
}
static int getIntDigit(int i)throws Exception{
if(i>0 && i<=10){
return i;
}else{
throw new Exception("輸入數的範圍不在0-10之間");
}
}
}
結果為:
這樣就可以捕獲到不同的異常資訊並對其進行處理了,其實以上程式碼的getIntDigit方法中的異常處理就是丟擲,並在主方法中進行捕獲。所以就不再寫關於丟擲異常的例項了。
在java的異常處理機制中還有很多不同的java異常處理類,這裡沒有一一說明,可以在響應的api文件進行查詢,當然如果有興趣也可以在敲程式碼過程中收集錯誤資訊。很好的利用異常處理可以提高程式碼的可讀性,使的程式碼更加簡潔!