java 異常的實(shí)例詳解
java 異常的實(shí)例詳解
1、異常的定義:程序在運(yùn)行時(shí)出現(xiàn)不正常情況。
異常的劃分:
Error:嚴(yán)重的問(wèn)題,對(duì)于error一般不編寫(xiě)針對(duì)性的代碼對(duì)其進(jìn)行處理。
Exception:非嚴(yán)重的問(wèn)題,對(duì)于exception可以使用針對(duì)性的處理方式進(jìn)行處理。
2、異常的處理:(固定格式)
try {需要被檢測(cè)的代碼;} catch(異常類 變量) {處理異常的代碼(處理方式);}//這里應(yīng)當(dāng)是要有針對(duì)性的處理方式 finally {一定會(huì)執(zhí)行的語(yǔ)句;}//通常是關(guān)閉資源的代碼,因?yàn)橘Y源必須得到釋放
對(duì)多異常的處理方式:
1、聲明異常時(shí),建議聲明更為具體的異常,這樣處理起來(lái)就更加的具體。
2、對(duì)方聲明幾個(gè)異常,就對(duì)應(yīng)及格catch塊,不要定義多余的catch塊,如果多個(gè)catch塊中的異常出現(xiàn)繼承關(guān)系,父類異常catch塊放在最下面。
*在進(jìn)行catch處理時(shí),catch中一定要定義具體的處理方式。
*catch是用于處理異常,如果沒(méi)有catch就代表異常沒(méi)有被處理過(guò),如果該異常是檢測(cè)時(shí)異常,那么必須聲明。
Runtime異常:(即運(yùn)行時(shí)異常)
是Exception中一個(gè)特殊的子類異常。
如果在函數(shù)內(nèi)拋出該異常,函數(shù)上可以不用聲明,編譯一樣通過(guò);如果在函數(shù)上聲明了該異常,調(diào)用者可以不用進(jìn)行處理,編譯一樣通過(guò)。
之所以用在函數(shù)上聲明,是因?yàn)椴恍枰屨{(diào)用者處理。
異常在子父類覆蓋中的體現(xiàn);
1,子類在覆蓋父類時(shí),如果父類的方法拋出異常,那么子類的覆蓋方法,只能拋出父類的異?;蛘咴摦惓5淖宇?。
2,如果父類方法拋出多個(gè)異常,那么子類在覆蓋該方法時(shí),只能拋出父類異常的子集。
3,如果父類或者接口的方法中沒(méi)有異常拋出,那么子類在覆蓋方法時(shí),也不可以拋出異常。
如果子類方法發(fā)生了異常。就必須要進(jìn)行try處理。絕對(duì)不能拋。
throws 和 throw 的區(qū)別:
throws:使用在函數(shù)上(小括號(hào)和大括號(hào)之間),后面跟的是異常類,可以跟多個(gè)。中間用“,”(逗號(hào))隔開(kāi)。
throw: 使用在函數(shù)內(nèi),后面跟的是異常對(duì)象。throw后面不能加語(yǔ)句,因?yàn)閠hrow后面的語(yǔ)句無(wú)法執(zhí)行到。
習(xí)題練習(xí):
/*需求:畢老師用電腦上課。 分析: 先寫(xiě)出正常運(yùn)行時(shí)的代碼:電腦開(kāi)機(jī)后上課 分析電腦會(huì)出現(xiàn)的問(wèn)題,如:藍(lán)屏,冒煙 此時(shí)需要自定義兩個(gè)“藍(lán)屏,冒煙“”自定義異常,封裝成對(duì)象。 藍(lán)屏后,電腦重啟,之后繼續(xù)上課 電腦冒煙后,出現(xiàn)了老師的問(wèn)題,不能上課了,可以先做練習(xí),畢老師將問(wèn)題拋給校長(zhǎng)。此時(shí)拋出的問(wèn)題不再是電腦冒煙,而應(yīng)該是老師不能上課了 問(wèn)題拋給校長(zhǎng)后,校長(zhǎng)catch后給出解決方案 */
class LanPingException extends Exception //自定義藍(lán)屏異常
{
LanPingException(String message)
{
super(message);
}
}
class MaoYanException extends Exception//自定義冒煙異常
{
MaoYanException(String message)
{
super(message);
}
}
class NoclassException extends Exception//自定義不能上課異常
{
NoclassException(String message)
{
super(message);
}
}
class Computer
{
private int state = 2;//硬性規(guī)定電腦狀態(tài)
//問(wèn)題是在運(yùn)行時(shí)發(fā)生的,所以得定義在運(yùn)行時(shí)
public void run()throws LanPingException,MaoYanException//因?yàn)橛锌赡艹霈F(xiàn)錯(cuò)誤,所以必須先聲明
{
if (state==2)
{
throw new LanPingException("電腦藍(lán)屏了。。。");//因?yàn)殡娔X不能自己處理,所以拋給了老師
}
if (state==3)
{
throw new MaoYanException("電腦冒煙了。。。");
}
System.out.println("電腦開(kāi)機(jī),運(yùn)行中。。。。");
}
public void restart()
{
System.out.println("電腦重啟。。。。");
}
}
class Teacher
{
private String name;
private Computer comp;
Teacher(String name)
{
this.name = name;
comp = new Computer();//初始化時(shí)老師就有電腦了
}
public void test()
{
System.out.println("做練習(xí)");
}
public void teach() throws NoclassException//標(biāo)識(shí)應(yīng)該是拋出去的異常,能夠進(jìn)行處理的
{
try
{
comp.run();//講課,要先開(kāi)啟電腦
}
catch (LanPingException e)//拋出了兩個(gè)異常,必須用兩個(gè)catch
{
System.out.println(e.getMessage());
comp.restart();
}
//這個(gè)問(wèn)題拋給老師的話依舊無(wú)法解決,應(yīng)該拋出對(duì)應(yīng)的問(wèn)題,這里老師拋出的問(wèn)題應(yīng)該是不能上課了
catch (MaoYanException e)
{
test();//不能上課,可以先布置練習(xí),這個(gè)必須在throw 之前,因?yàn)閠hrow之后的語(yǔ)句不會(huì)執(zhí)行
throw new NoclassException(e.getMessage()+",無(wú)法繼續(xù)上課");
}
System.out.println(name+",上課中。。。。");
}
}
class ExceptionTest
{
public static void main(String[] args)
{
Teacher t = new Teacher("畢老師");//指定一個(gè)老師
try
{
t.teach();//老師運(yùn)行這個(gè)方法
}
catch (NoclassException e)//抓住對(duì)應(yīng)的拋出的問(wèn)題
{
System.out.println(e.toString());//打印出問(wèn)題原因
System.out.println("自習(xí)或者放假");//處理辦法
}
}
}
當(dāng)電腦狀態(tài)為1時(shí),輸出為: 電腦開(kāi)機(jī),運(yùn)行中。。。。 畢老師,上課中。。。。 當(dāng)電腦狀態(tài)為2時(shí),輸出為: 電腦藍(lán)屏了。。。 電腦重啟。。。。 畢老師,上課中。。。。 當(dāng)電腦狀態(tài)為3時(shí),輸出為: 做練習(xí) NoclassException: 電腦冒煙了。。。,無(wú)法繼續(xù)上課 自習(xí)或者放假
如有疑問(wèn)請(qǐng)留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
相關(guān)文章
Java異常處理UncaughtExceptionHandler使用實(shí)例代碼詳解
當(dāng)一個(gè)線程由于未捕獲異常即將終止時(shí),Java虛擬機(jī)將使用thread . getuncaughtexceptionhandler()查詢線程的uncaughtException處理程序,并調(diào)用處理程序的uncaughtException方法,將線程和異常作為參數(shù)傳遞2023-03-03
通過(guò)java api實(shí)現(xiàn)解壓縮zip示例
這篇文章主要介紹了通過(guò)java api實(shí)現(xiàn)解壓縮zip示例,需要的朋友可以參考下2014-04-04
spring cloud gateway整合sentinel實(shí)現(xiàn)網(wǎng)關(guān)限流
這篇文章主要介紹了spring cloud gateway整合sentinel實(shí)現(xiàn)網(wǎng)關(guān)限流,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-01-01
idea創(chuàng)建javaweb原生項(xiàng)目的實(shí)現(xiàn)示例
這篇文章主要介紹了idea創(chuàng)建javaweb原生項(xiàng)目的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-09-09
RocketMQ消息過(guò)濾與查詢的實(shí)現(xiàn)
這篇文章主要介紹了RocketMQ消息過(guò)濾與查詢的實(shí)現(xiàn)方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java中List根據(jù)map的某個(gè)key去重的代碼
今天小編就為大家分享一篇關(guān)于Java中List根據(jù)map的某個(gè)key去重的代碼,小編覺(jué)得內(nèi)容挺不錯(cuò)的,現(xiàn)在分享給大家,具有很好的參考價(jià)值,需要的朋友一起跟隨小編來(lái)看看吧2018-12-12
Java實(shí)現(xiàn)利用廣度優(yōu)先遍歷(BFS)計(jì)算最短路徑的方法
這篇文章主要介紹了Java實(shí)現(xiàn)利用廣度優(yōu)先遍歷(BFS)計(jì)算最短路徑的方法,實(shí)例分析了廣度優(yōu)先遍歷算法的原理與使用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04

