/*
捕獲異常 | 處理異常
異常
異常的體系
|---Throwable
| |--------Error ?錯(cuò)誤? 一般是硬件引發(fā)的問(wèn)題挽放,不會(huì)通過(guò)代碼來(lái)處理
| |--------Exception? 異常竖共,都是通過(guò)代碼來(lái)處理的
| | |----------編譯時(shí)異常 如果一個(gè)方法內(nèi)部跑出了編譯時(shí)異常剧防,那么在方法上必須聲明異常壮池,調(diào)用者也必須要處理異常;
| | |----------運(yùn)行時(shí)異常 如果一個(gè)方法內(nèi)部拋出了運(yùn)行時(shí)異常,那么在方法上可以聲明異常也可以不聲明異常,調(diào)用者可以處理也可以不處理叛买;
運(yùn)行時(shí)異常: RuntimeException及其子類(lèi)都是運(yùn)行時(shí)異常;
編譯時(shí)異常: 除了了運(yùn)行時(shí)異常都是編譯時(shí)異常
為什么對(duì)編譯時(shí)異常要求如此嚴(yán)格:
運(yùn)行時(shí)異常都是可以通過(guò)程序員良好的編譯習(xí)慣去避免的,所以java編譯器就咩有嚴(yán)格要求處理運(yùn)行時(shí)異常.
異常處理
方式一: 捕獲處理
捕獲處理格式:
try
{
可能出現(xiàn)異常的代碼;
}
catch(異常類(lèi)型 變量名)
{
異常處理代碼:
}
捕獲處理的規(guī)則:
1. try快中的異常被正確處理后锭环,try-catch外名的語(yǔ)句可以正常執(zhí)行;
2. try中出現(xiàn)了異常語(yǔ)句聪全,jvm就會(huì)創(chuàng)建異常交給catch處理,不會(huì)再執(zhí)行異常代碼后面的代碼:
3. 如果try中沒(méi)有出現(xiàn)異常辅辩,那么catch總的語(yǔ)句不會(huì)執(zhí)行,因?yàn)閖vm不會(huì)創(chuàng)建異常類(lèi)型;
4. 一個(gè)try快可以捕獲多種類(lèi)型的異常娃圆,需要多個(gè)catch類(lèi)接收異常對(duì)象的,但是捕獲異常的順序必須從
小往大進(jìn)行捕獲;
方式二: 拋出處理 throw + throws
格式:
throw new 異常類(lèi)//拋出異常
class Demo8
{
public static void main(String[] args)
{
//System.out.println("Hello world!");
try //捕獲拋出的異常
{
div(3,0);
}
catch (Exception e)
{
System.out.println("出現(xiàn)了異常");
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);
}
}
規(guī)則:
1. 如果一個(gè)方法內(nèi)部拋出了異常對(duì)象玫锋,那么必須在方法上聲明拋出異常
2. 如果調(diào)用了一個(gè)聲明拋出異常的方法,那么調(diào)用者必須要處理異常:
3. 如果一個(gè)方法內(nèi)部拋出了一個(gè)異常對(duì)象讼呢,那么該語(yǔ)句后面的代碼都不會(huì)再執(zhí)行了;
4. 在一種情況下撩鹿,只能拋出一種類(lèi)型的異常對(duì)象;? 保證一次只處理一個(gè)異常;
throw & throws
1. throw 用于方法內(nèi)部的異常對(duì)象拋出,用于在函數(shù)上聲明
2. throw后面只能有一個(gè)異常對(duì)象悦屏,throws后面一次可以聲明拋出多種類(lèi)似的異常节沦;
拋出處理的作用:
被調(diào)用者通知調(diào)用者出現(xiàn)了異常,需要調(diào)用者知道出現(xiàn)了異常
拋出異常和捕獲異常的使用場(chǎng)合
1. 如果被調(diào)用者需要通知調(diào)用者出現(xiàn)了異常础爬,就使用拋出異常;
2. 如果代碼是直接與用戶打交道就不能再拋出異常了甫贯,這時(shí)候就需要使用捕獲異常;
*/
//捕獲異常
class Demo7
{
public static void main(String[] args)
{
try //捕獲拋出的異常
{
div(3,0);
}
catch (Exception e)
{
System.out.println("出現(xiàn)了異常");
e.printStackTrace();
}
}
public static void div(int a, int b)
{
int c = 0;
try
{
c = a/b; //jvm發(fā)現(xiàn)有異常的時(shí)候,就會(huì)創(chuàng)建一個(gè)相應(yīng)的異常對(duì)象看蚜,也就是說(shuō)異常對(duì)象是jvm創(chuàng)建的;
}
catch (ArithmeticException e) //在此聲明一個(gè)相應(yīng)的異常對(duì)象變量指向jvm創(chuàng)建的異常對(duì)象叫搁;
{
System.out.println("toString:" + e.toString());
}
catch (Exception e) //接收各種類(lèi)型的異常,用到了多態(tài);
{
System.out.println("包治百病");
}
System.out.println(c);
}
}