以前我們對代碼的認識也許就是能跑起來就挺好的.至少我以前就是這樣,但是我們的程序難免會在運行的過程中出現這樣或那樣的錯誤,有些問題我們在寫代碼的過程中沒有注意到,或者我們沒有辦法避免這樣的問題,要是使用這樣的方法就可能會存在某一類錯誤.
這時我們該怎么辦?
讓程序停止運行?
異常處理就給我們提供了一種很好的解決方案.
### 何為異常?
Java異常是java提供的用于處理程序在運行過程中發生的一些異常事件的一種機制.好的程序應該在異常發生是提供處理這些錯誤的方法,使得程序不會因為異常的發生而產生不可預見的結果.?,當程序發生異常時,java給我們提供了一種處理這種異常的方法.讓我們的程序能夠更好的處理異常.
### 異常分類

從圖中我們可以看到Throwable類是所有異常類的超類,該類的兩個直接子類是Error和Exception,其中Error表示這是系統錯誤是無法處理的,而Exception是可以處理的錯誤。其中在Exception下的一個子類RuntimeException表示這類錯誤時經常出現的錯誤,對這樣的錯誤可以處理也可以不處理。
此外異常還可以分為運行時異常和非運行時異常,運行時異常是RuntimeException異常,而其他的異常則為非運行時異常。


### 異常的處理
對于異常的處理,我們會用到try…….catch……finally,三個語句塊
其中try語句塊下的代碼時需要執行的代碼,這段代碼可能會出現異常。我們也可以理解為我要嘗試去執行語句塊中的代碼。
Catch語句塊是當try語句塊中嘗試執行的代碼發生異常后,catch就是讓我們去捕捉這個異常。捕捉到后就可以對異常進行處理。Catch 語句塊可以有很多,每個catch都會步驟一個類型的異常。如果在嘗試執行的語句塊中可能會發生文件不存在和溢出兩個異常這時就要用catch去捕捉,只寫其中一個,另一個是不能被捕捉到的。

Finally語句塊是不管發不發生異常都要執行的。Finally該語句塊通常用于放置程序中必須執行的代碼,如關閉數據庫的連接關閉IO流。
?
需要注意的是當try語句塊中發生了異常后,會從發生異常的代碼跳到catch語句塊,也就是說發生了異常的哪一行代碼之后的代碼時不執行的。
?
### 異常的拋出(throw 和throws)
當我們的程序發生可能會發生異常的時候,我們可以進行的操作包括自己手動去處理異常或者將異常交給方法的調用者去處理。這時手動處理就使用的throw,如果要將異常交給調用者去處理就需要在方法聲明行里使用throws來告訴方法的調用者,我的代碼可能要出這樣的異常,你要處理。
Throw 通常在方法體里,去拋出異常,而throws通常在方法聲明中,之處可能會拋出的異常
?
一段示例代碼
~~~
public class throwTest {
int[] number={100,80,50,12,16};//創建并初始化具有6個元素的數組
public void setNum(int index,int value)//賦值
{
number[index]=value;
}
public int GetNum(int index)//取值
{
return number[index];
}
public static void main(String[] args){
try{
throwTest tt=new throwTest();
int value=tt.GetNum(7);
System.out.print(value);
}
catch(ArrayIndexOutOfBoundsException ex){
System.out.print("下標越界");
}
finally
{
System.out.println("\n不管發生不發生異常這行代碼都要執行!");
}
}
}
~~~
這段代碼展示了一個簡單的捕獲異常并處理的代碼。這這段代碼中出現了下標越界。
?
看這樣一個錯誤

在方法體中我拋出了一個錯誤,我并沒有對這個錯誤進行處理。系統就對我說我必須對其進行捕獲或聲明以便拋出。所以當錯誤出現時我們的處理方式就可以有以下兩種,捕獲或者拋出。
### 自定義異常類
對于異常我們也可以自定義,創建自定義的異常類需要繼承自Exception類,并提供一個含有String類型的參數。該參數就是異常描述的信息。
下面是一段代碼示例
首先定義一個異常類
~~~
public class NewException extends Exception{
//定義一個構造方法
public NewException(String msg)
{
super(msg);//調用含有參數的構造方法
}
}
~~~
然后是程序代碼。在代碼中如輸入的數字大于100則拋出自定義的異常。
~~~
import count3quit.NewException;
public class throwTest {
int[] number={100,80,50,12,16};//創建并初始化具有6個元素的數組
public void setNum(int index,int value) throws NewException//賦值
{
if(value>=100)
{
throw new NewException("捕獲異常成功");
}
number[index]=value;
}
public static void main(String[] args){
try{
throwTest tt=new throwTest();
tt.setNum(1, 200);
}
catch(NewException ex)
{
System.out.print(ex.getMessage());
}
}
}
~~~
### 總結
在異常處理之前我們總是使用if語句去處理在程序中發生的一些錯誤但是這無疑是很費力的,此外if語句的使用讓代碼的可讀性降低。更重要的是對于一些無法預料的異常時刻威脅的應用程序,毫無疑問,異常處理讓應用程序更加的安全