# **一、何為異常?**
## 1.生活中的實例
生活中存在許多不正常:
上班路上自行車掉鏈子
上廁所手機掉馬桶
下班回家鑰匙丟失
。。。。。。。
2.程序中的實例
我們的代碼中也許存在許多紕漏,導致用戶使用時程序突然停止工作,例如下面簡單的Java代碼完成一個加法器:
import java.util.Scanner;
public class Count {
public static void main (String []args){
int a , b;
Scanner read = new Scanner(System.in);
System.out.print("請輸入a:");
a = read.nextInt();
System.out.print("請輸入b:");
b = read.nextInt();
System.out.println("a+b="+(a+b));
}
}
看看輸入數據會不會出現異常:
- 當輸入100和200時,運行正常:
- 當輸入100和a時,運行報錯: 
這就是Java中的異常,輸入不合法,程序無法繼續運行被迫終止,流程圖如下:

3.異常的概念
異常:異常指的是在程序運行過程中發生的異常事件,通常是由硬件問題或者程序設計問題所導致的。在Java等面向對象的編程語言中異常屬於對象(Java語言中異常分為運行時異常(Exception)和編譯型異常(Error))。
二、Java中異常處理機制
## 1.Java異常處理機制的概念
Java異常處理機制就是程序代碼執行過程中出現異常后,會按照我們預先制定的處理方法對異常進行處理,異常處理完成后程序會繼續運行下去。

2.關鍵字try、throw、throws、catch、finally
try: 嘗試執行被此關鍵字作用的代碼塊A,若出現異常則忽略代碼塊A中剩下的代碼。
throws: 聲明方法中將拋出的異常,通常在方法名后出現。
throw: 手動拋出異常。
catch: 捕獲處理異常。
finally:不論出現不出現異常都要此塊代碼都要執行。

3.try-catch塊
try語句塊中代碼執行時發生三種情況:
- try語句塊中代碼正常執行完畢,沒有任何異常,那么catch語句塊的代碼將不會被執行。
import java.util.*;
public class Count {
public static void main (String []args){
int a , b;
Scanner read = new Scanner(System.in);
try{
System.out.print("請輸入a:");
a = read.nextInt();
System.out.print("請輸入b:");
b = read.nextInt();
System.out.println("a+b="+(a+b));
}catch(InputMismatchException ex){
System.out.println("不可以,請輸數字!");
}
System.out.println("<<<<歡迎使用!>>>>");
}
}
輸入100和200后程序順利進行!
- try語句塊中代碼執行過程中產生異常,並且該異常跟catch中聲明的異常類型相符合,那么try語句塊中剩余的代碼將被忽略,catch語句塊的代碼將被執行。
還是上面代碼,輸入100和a后程序運行如下:
- **try**語句塊中代碼執行過程中產生異常,但是拋出的異常並沒有在**catch**語句塊中聲明,那么這個時候程序會立刻終止。
4.try-catch-finally塊
在catch子句后加入finally塊,可以確保無論是否發生異常,finally塊中的代碼總能被執行。
- 代碼示例:
import java.util.*;
public class Count {
public static void main (String []args){
int a , b;
Scanner read = new Scanner(System.in);
try{
System.out.print("請輸入a:");
a = read.nextInt();
System.out.print("請輸入b:");
b = read.nextInt();
System.out.println("a+b="+(a+b));
}catch(Exception ex){
System.out.println("不可以,請輸數字!");
}finally{
System.out.println("<<<<歡迎使用!>>>>");
}
}
}
- 運行結果:
5.多重catch塊
- 一段代碼可能會產生多個異常。
- 依次對每個catch塊聲明的異常對象進行檢查,找到執行第一個與try拋出的異常類型匹配的catch塊,之后的catch塊將被忽略。
- 異常子類一定要位於異常父類之前,如下圖:
