/*
捕獲異常 | 處理異常
異常
異常的體系
|---Throwable
| |--------Error ?錯誤? 一般是硬件引發的問題,不會通過代碼來處理
| |--------Exception? 異常,都是通過代碼來處理的
| | |----------編譯時異常 如果一個方法內部跑出了編譯時異常,那么在方法上必須聲明異常,調用者也必須要處理異常;
| | |----------運行時異常 如果一個方法內部拋出了運行時異常,那么在方法上可以聲明異常也可以不聲明異常,調用者可以處理也可以不處理;
運行時異常: RuntimeException及其子類都是運行時異常;
編譯時異常: 除了了運行時異常都是編譯時異常
為什么對編譯時異常要求如此嚴格:
運行時異常都是可以通過程序員良好的編譯習慣去避免的,所以java編譯器就咩有嚴格要求處理運行時異常.
異常處理
方式一: 捕獲處理
捕獲處理格式:
try
{
可能出現異常的代碼;
}
catch(異常類型 變量名)
{
異常處理代碼:
}
捕獲處理的規則:
1. try快中的異常被正確處理后,try-catch外名的語句可以正常執行;
2. try中出現了異常語句,jvm就會創建異常交給catch處理,不會再執行異常代碼后面的代碼:
3. 如果try中沒有出現異常,那么catch總的語句不會執行,因為jvm不會創建異常類型;
4. 一個try快可以捕獲多種類型的異常,需要多個catch類接收異常對象的,但是捕獲異常的順序必須從
小往大進行捕獲;
方式二: 拋出處理 throw + throws
格式:
throw new 異常類//拋出異常
class Demo8
{
public static void main(String[] args)
{
//System.out.println("Hello world!");
try //捕獲拋出的異常
{
div(3,0);
}
catch (Exception e)
{
System.out.println("出現了異常");
e.printStackTrace();
}
}
public static void div(int a, int b) throws Exception
{
if(b == 0)
{
throw new Exception();? //拋出異常
}
int c = a/b;
System.out.println("c="+c);
}
}
規則:
1. 如果一個方法內部拋出了異常對象,那么必須在方法上聲明拋出異常
2. 如果調用了一個聲明拋出異常的方法,那么調用者必須要處理異常:
3. 如果一個方法內部拋出了一個異常對象,那么該語句后面的代碼都不會再執行了;
4. 在一種情況下,只能拋出一種類型的異常對象;? 保證一次只處理一個異常;
throw & throws
1. throw 用于方法內部的異常對象拋出,用于在函數上聲明
2. throw后面只能有一個異常對象,throws后面一次可以聲明拋出多種類似的異常;
拋出處理的作用:
被調用者通知調用者出現了異常,需要調用者知道出現了異常
拋出異常和捕獲異常的使用場合
1. 如果被調用者需要通知調用者出現了異常,就使用拋出異常;
2. 如果代碼是直接與用戶打交道就不能再拋出異常了,這時候就需要使用捕獲異常;
*/
//捕獲異常
class Demo7
{
public static void main(String[] args)
{
try //捕獲拋出的異常
{
div(3,0);
}
catch (Exception e)
{
System.out.println("出現了異常");
e.printStackTrace();
}
}
public static void div(int a, int b)
{
int c = 0;
try
{
c = a/b; //jvm發現有異常的時候,就會創建一個相應的異常對象,也就是說異常對象是jvm創建的;
}
catch (ArithmeticException e) //在此聲明一個相應的異常對象變量指向jvm創建的異常對象;
{
System.out.println("toString:" + e.toString());
}
catch (Exception e) //接收各種類型的異常,用到了多態;
{
System.out.println("包治百病");
}
System.out.println(c);
}
}