版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
江蘇理工學(xué)院第7章異常處理—讓云醫(yī)院系統(tǒng)更加穩(wěn)健時(shí)間:主講人:2025.62025異常處理機(jī)制:確保云醫(yī)院系統(tǒng)穩(wěn)定運(yùn)行自定義異常:增強(qiáng)云醫(yī)院系統(tǒng)的異常處理能力內(nèi)部類(lèi)目錄CONTENTS異常處理機(jī)制:確保云醫(yī)院系統(tǒng)穩(wěn)定運(yùn)行Part.01江蘇理工學(xué)院異常分類(lèi)Java將異常分為捕獲異常和未捕獲異常。Error類(lèi)異常通常指JVM重大問(wèn)題,如內(nèi)存溢出,程序無(wú)法處理。Exception類(lèi)異常是運(yùn)行時(shí)問(wèn)題,可通過(guò)try-catch-finally處理。常見(jiàn)異常類(lèi)表7-1列舉了常見(jiàn)系統(tǒng)異常類(lèi),如ArithmeticException(算術(shù)異常)、ArrayIndexOutOfBoundsException(數(shù)組下標(biāo)越界異常)、NullPointerException(空指針異常)等。Java中常見(jiàn)的系統(tǒng)異常類(lèi)型【例7-1】publicclassRuntimeExceptionExample{publicstaticvoidmain(String[]args){int[]numbers={1,2,3};//嘗試訪問(wèn)不存在的索引(數(shù)組長(zhǎng)度=3,有效索引為0-2)System.out.println(numbers[3]);//觸發(fā)異常}}常見(jiàn)的異常類(lèi)型異常類(lèi)名稱(chēng)異常類(lèi)含義ArithmeticException算術(shù)異常類(lèi)ArrayIndexOutOfBoundsException數(shù)組下標(biāo)越界異常類(lèi)ArrayStoreException將與數(shù)組類(lèi)型不兼容的值賦給數(shù)組元素時(shí)拋出的異常類(lèi)ClassCastException類(lèi)型強(qiáng)制轉(zhuǎn)換異常類(lèi)ClassNotFoundException未找到指定類(lèi)異常類(lèi)EOFException文件已結(jié)束異常類(lèi)FileNotFoundException文件未找到異常類(lèi)IOException輸入/輸出異常類(lèi)NegativeArraySizeException建立元素個(gè)數(shù)為負(fù)數(shù)的數(shù)組異常類(lèi)NullPointerException空指針異常類(lèi)NumberFormatException字符串轉(zhuǎn)換為數(shù)字異常類(lèi)SQLException操作數(shù)據(jù)庫(kù)異常類(lèi)StringIndexOutOfBoundsException字符串索引超出范圍異常表7-1常見(jiàn)的系統(tǒng)異常類(lèi)多重異常處理當(dāng)有多個(gè)catch語(yǔ)句時(shí),只會(huì)匹配其中一個(gè)異常類(lèi)并執(zhí)行catch塊,匹配順序由上到下。如果在catch塊中拋出異常,則finally之外的語(yǔ)句將不被執(zhí)行。try-catch-finally格式異常處理采用統(tǒng)一機(jī)制。try塊包含可能引發(fā)異常的代碼,catch塊捕獲并處理異常,finally塊無(wú)論是否發(fā)生異常都會(huì)執(zhí)行,用于資源釋放或清理工作。語(yǔ)法格式:try{…//程序塊}catch(異常類(lèi)
對(duì)象名稱(chēng)){…//異常發(fā)生時(shí)的處理語(yǔ)句}finally{
…//無(wú)論是否出現(xiàn)異常都要執(zhí)行的代碼}異常捕獲與處理【例7-2】程序異常分析。publicclassExanple_exception{publicstaticvoidmain(String[]args)throwsException{ try{ Scannerscanner=newScanner(System.in); inta=scanner.nextInt(); intb=scanner.nextInt(); intc[]={5,6,7,8,9}; System.out.println(26/a); System.out.println(c[b]); } catch(ArithmeticExceptionex1){ System.out.println("被零除:"+ex1); throwex1; } catch(ArrayIndexOutOfBoundsExceptionex2){ System.out.println("數(shù)組下標(biāo)越界:"+ex2); } finally{ System.out.println("肯定會(huì)執(zhí)行的語(yǔ)句!"); } System.out.println("主程序正常結(jié)束!"); }}案例分析如果輸入0和1,程序運(yùn)行結(jié)果如圖7所示。如果輸入1和6,程序運(yùn)行結(jié)果如圖所示。案例運(yùn)行結(jié)果在云醫(yī)院系統(tǒng)中,有一個(gè)用于獲取患者信息的方法。這個(gè)方法需要從一個(gè)患者對(duì)象中獲取患者的姓名。如果傳入的患者對(duì)象是null,那么會(huì)引發(fā)NullPointerException。思考:如何設(shè)計(jì)實(shí)現(xiàn)對(duì)患者信息異常的監(jiān)聽(tīng)和捕獲?場(chǎng)景分析0102拋出異常程序可通過(guò)throw關(guān)鍵字拋出異常,條件可通過(guò)if語(yǔ)句實(shí)現(xiàn)。如果拋出的是檢查異常,則需在方法頭部聲明拋出異常類(lèi)型。thrownewException();聲明拋出異常類(lèi)型在成員方法頭部,通過(guò)throws關(guān)鍵字聲明方法可能拋出的已檢查異常。調(diào)用者需捕獲處理拋出的異常。Typemethodname(parameterlist)throwsexception1,exception2,…,exceptionn{}throw和throws語(yǔ)句publicclassPeople{ intage; publicintcheck(Stringstr)throwsException{ age=Integer.parseInt(str); if(age<0) thrownewException("年齡不能為負(fù)數(shù)!"); returnage; } publicstaticvoidmain(String[]args){ Peoplep=newPeople();//由于下面調(diào)用可能拋出異常的方法check(),因此需要用try-catch捕獲 try{ intmyage=p.check("-45"); System.out.println(myage); }catch(Exceptione){ System.out.println("數(shù)據(jù)邏輯錯(cuò)誤!"); System.out.println("原因:"+e.getMessage()); } }}案例分析【例7-3】創(chuàng)建People類(lèi),該類(lèi)中的check方法首先將傳遞進(jìn)來(lái)的String類(lèi)型的參數(shù)轉(zhuǎn)換成int型,檢查int型整數(shù)是否為負(fù)數(shù),若為負(fù)數(shù)則拋出異常;然后在該類(lèi)的main方法中捕獲異常并處理。自定義異常:增強(qiáng)云醫(yī)院系統(tǒng)的異常處理能力Part.02江蘇理工學(xué)院自定義異常類(lèi)必須繼承Throwable類(lèi),通常是繼承Exception類(lèi)或其子類(lèi)??捎糜谠漆t(yī)院系統(tǒng)中任何需要監(jiān)控和管理內(nèi)存使用的場(chǎng)景,以幫助開(kāi)發(fā)人員更好地控制內(nèi)存資源,如可以定義防止內(nèi)存溢出異常,用于檢測(cè)以防止系統(tǒng)崩潰或性能下降。在CloudHospitalSystem類(lèi)中,通過(guò)loadDataToMemory方法模擬加載數(shù)據(jù)到內(nèi)存,并檢查內(nèi)存使用量是否超過(guò)最大值。如果超過(guò),則拋出DataMemoryOverflowException,并在main方法中捕獲處理。自定義異常類(lèi)異常拋出與捕獲0102數(shù)據(jù)內(nèi)存溢出處理0102【例7-4】設(shè)計(jì)一個(gè)簡(jiǎn)單的自定義異常類(lèi)DataMemoryOverflowException,用于防止云醫(yī)院系統(tǒng)中的數(shù)據(jù)內(nèi)存溢出。publicclassDataMemoryOverflowExceptionextendsRuntimeException{//默認(rèn)構(gòu)造函數(shù)
publicDataMemoryOverflowException(){super("Datamemoryoverflowoccurred!");}
//帶錯(cuò)誤消息的構(gòu)造函數(shù)
publicDataMemoryOverflowException(Stringmessage){super(message);}
//可選:帶錯(cuò)誤消息和原因的構(gòu)造函數(shù)
publicDataMemoryOverflowException(Stringmessage,Throwablecause){super(message,cause);}
//可選:僅帶原因的構(gòu)造函數(shù)
publicDataMemoryOverflowException(Throwablecause){super(cause);}}自定義異常案例分析0202/*使用這個(gè)自定義異常類(lèi)時(shí),可以在檢測(cè)到內(nèi)存溢出風(fēng)險(xiǎn)的情況時(shí)拋出它,如在處理大量數(shù)據(jù)或進(jìn)行內(nèi)存密集型操作時(shí)*/publicclassCloudHospitalSystem{privatestaticfinallongMAX_MEMORY_USAGE=1024*1024*100;publicstaticvoidmain(String[]args){try{//模擬加載數(shù)據(jù)到內(nèi)存
loadDataToMemory();}catch(DataMemoryOverflowExceptione){//捕獲并處理內(nèi)存溢出異常
System.out.println("CaughtDataMemoryOverflowException:"+e.getMessage());//執(zhí)行必要的清理或恢復(fù)操作
}}publicstaticvoidloadDataToMemory()throwsDataMemoryOverflowException{//模擬內(nèi)存使用情況
longcurrentMemoryUsage=getCurrentMemoryUsage();//檢查是否超過(guò)最大內(nèi)存使用量
if(currentMemoryUsage>MAX_MEMORY_USAGE){//拋出內(nèi)存溢出異常
thrownewDataMemoryOverflowException("Currentmemoryusageexceedsthemaximumlimit!");}//繼續(xù)處理數(shù)據(jù)}//一個(gè)模擬的方法,用于獲取當(dāng)前內(nèi)存使用量
//在實(shí)際應(yīng)用中,用戶(hù)可能需要使用更精確的方法來(lái)監(jiān)控內(nèi)存使用
privatestaticlonggetCurrentMemoryUsage(){//這里返回一個(gè)模擬的內(nèi)存使用量值
return512*1024*80;//假設(shè)當(dāng)前使用了80MB內(nèi)存
}}自定義異常案例分析在患者信息存儲(chǔ)過(guò)程中,如果系統(tǒng)檢測(cè)到存儲(chǔ)空間不足、存儲(chǔ)服務(wù)不可用或達(dá)到存儲(chǔ)限制等異常情況,應(yīng)設(shè)計(jì)對(duì)應(yīng)的異常捕獲?;颊咝畔⒋鎯?chǔ)異常01在患者信息讀取過(guò)程中,如果系統(tǒng)無(wú)法找到所請(qǐng)求的患者信息、讀取服務(wù)不可用或存在訪問(wèn)權(quán)限問(wèn)題等異常情況,同樣需要捕獲異常。患者信息讀取異常02信息存儲(chǔ)與讀取異常分析//1、構(gòu)建自定義異常類(lèi)publicclassStorageAccessExceptionextendsException{publicStorageAccessException(){super("Storageaccesserroroccurred!");}
publicStorageAccessException(Stringmessage){super(message);}
publicStorageAccessException(Stringmessage,Throwablecause){super(message,cause);}
publicStorageAccessException(Throwablecause){super(cause);}}【例7-5】設(shè)計(jì)自定義異常類(lèi)StorageAccessException,實(shí)現(xiàn)存儲(chǔ)或讀取患者信息時(shí)檢測(cè)拋出該異常。案例分析//2、創(chuàng)建一個(gè)模擬的云醫(yī)院信息存儲(chǔ)與讀取的類(lèi)PatientDataStorage,并在其中模擬異常拋出publicclassPatientDataStorage{privateMap<Integer,String>patientData=newHashMap<>();publicvoidstorePatientData(intpatientId,Stringdata)throwsStorageAccessException{if(patientData.size()>=10){//假設(shè)最大存儲(chǔ)10條記錄
thrownewStorageAccessException("Storageisfull,cannotstoremoredata!");}patientData.put(patientId,data);System.out.println("Patientdatastoredsuccessfully.");}publicStringreadPatientData(intpatientId)throwsStorageAccessException{if(!patientData.containsKey(patientId)){thrownewStorageAccessException("Patientdatanotfound!");}
returnpatientData.get(patientId);}}【例7-5】設(shè)計(jì)自定義異常類(lèi)StorageAccessException,實(shí)現(xiàn)存儲(chǔ)或讀取患者信息時(shí)檢測(cè)拋出該異常。案例分析//3、創(chuàng)建一個(gè)主類(lèi)來(lái)演示如何使用PatientDataStorage類(lèi)publicclassCloudHospitalApp{publicstaticvoidmain(String[]args){PatientDataStoragestorage=newPatientDataStorage();try{//存儲(chǔ)患者信息
storage.storePatientData(1,"Patient1data");storage.storePatientData(2,"Patient2data");//嘗試存儲(chǔ)超過(guò)最大容量的數(shù)據(jù),應(yīng)該拋出StorageAccessExceptionstorage.storePatientData(11,"Patient11data");}catch(StorageAccessExceptione){System.out.println("CaughtStorageAccessException:"+e.getMessage());//處理異常,如記錄日志、通知用戶(hù)等
}try{Stringdata=storage.readPatientData(1);System.out.println("Readpatientdata:"+data);//嘗試讀取不存在的數(shù)據(jù),應(yīng)該拋出StorageAccessExceptiondata=storage.readPatientData(99);}catch(StorageAccessExceptione){System.out.println("CaughtStorageAccessException:"+e.getMessage());//處理異常,如記錄日志、通知用戶(hù)等
}}}案例分析創(chuàng)建了一個(gè)PatientDataStorage類(lèi)來(lái)模擬患者信息的存儲(chǔ)與讀取。定義了兩個(gè)方法storePatientData和readPatientData,它們分別用于存儲(chǔ)和讀取患者信息,并在特定情況下拋出StorageAccessException。在CloudHospitalApp主類(lèi)中,演示了如何使用PatientDataStorage類(lèi),捕獲并處理可能拋出的StorageAccessException。因此,使用自定義的異常類(lèi)的最大優(yōu)點(diǎn)就是當(dāng)開(kāi)發(fā)人員需要自己開(kāi)發(fā)實(shí)現(xiàn)某些規(guī)則、功能的代碼時(shí),一旦情況不滿(mǎn)足要求,可以向外拋出自己的異常,對(duì)調(diào)用者而言非常方便,提高了程序的健壯性與代碼的可讀性,這種開(kāi)發(fā)方式一勞永逸。案例分析內(nèi)部類(lèi)Part.03在其他類(lèi)中定義的類(lèi)稱(chēng)為內(nèi)部類(lèi)。內(nèi)部類(lèi)具有獨(dú)立的命名空間,可隨意使用外部類(lèi)的成員方法和變量,即使這些成員被修飾為private。內(nèi)部類(lèi)定義示例代碼中定義了OuterClass類(lèi)和其成員內(nèi)部類(lèi)InnerClass。InnerClass可直接訪問(wèn)外部類(lèi)的私有成員,并可通過(guò)外部類(lèi)的方法調(diào)用內(nèi)部類(lèi)的方法。成員內(nèi)部類(lèi)內(nèi)部類(lèi)的概念案例分析【例7-6】創(chuàng)建成員內(nèi)部類(lèi)的實(shí)例對(duì)象。publicclassOuterClass{ privateintx; InnerClassin=newInnerClass(); publicvoidouf(){ in.inf(); } classInnerClass{ inty=x+2; //可以直接訪問(wèn)外部類(lèi)的私有成員 publicvoidinf(){ } } publicInnerClassdoit(){ in.y=in.y+2; returnin; } publicstaticvoidmain(Stringargs[]){ OuterClassout=newOuterClass(); System.out.println(out.in.y); out.in=out.doit(); System.out.println(out.in.y); }}示例代碼中創(chuàng)建了一個(gè)匿名內(nèi)部類(lèi)對(duì)象v,實(shí)現(xiàn)了Vehicle接口,并定義了drive方法。接口式匿名內(nèi)部類(lèi)示例代碼中創(chuàng)建了一個(gè)匿名內(nèi)部類(lèi)對(duì)象car,繼承自Car類(lèi),并重寫(xiě)了drive方法。繼承式匿名內(nèi)部類(lèi)匿名內(nèi)部類(lèi)是一種特殊的局部?jī)?nèi)部類(lèi),定義時(shí)沒(méi)有名字??赏ㄟ^(guò)new類(lèi)名或接口名()的方式創(chuàng)建匿名內(nèi)部類(lèi)對(duì)象。new類(lèi)名或接口名(){
匿名類(lèi)的類(lèi)體}匿名內(nèi)部類(lèi)定義匿名內(nèi)部類(lèi)案例分析比較【例7-7】繼承式的匿名內(nèi)部類(lèi)舉例。publicclassCa
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高職第一學(xué)年(陶瓷設(shè)計(jì)與工藝)陶瓷裝飾設(shè)計(jì)階段測(cè)試試題及答案
- 大學(xué)(金融學(xué))金融市場(chǎng)學(xué)2026年階段測(cè)試題及答案
- 2025年大學(xué)信息資源管理(信息管理學(xué))試題及答案
- 2025年大學(xué)物理(光學(xué)原理)試題及答案
- 2025年中職生物學(xué)(生物基礎(chǔ)知識(shí))試題及答案
- 2025年大學(xué)本科(法學(xué))法律文書(shū)寫(xiě)作綜合測(cè)試題及答案
- 2026年綜合測(cè)試(植物保護(hù)常識(shí))考題及答案
- 2025年高職音樂(lè)(作曲基礎(chǔ)理論)試題及答案
- 2025年大學(xué)(基礎(chǔ)醫(yī)學(xué))生理學(xué)實(shí)驗(yàn)階段測(cè)試題及解析
- 2025年大學(xué)寶石及材料工藝學(xué)(寶石工藝技巧)試題及答案
- 2025年甘肅省武威市涼州區(qū)大柳鎮(zhèn)選聘專(zhuān)業(yè)化管理大學(xué)生村文書(shū)筆試考試備考試題及答案解析
- 2025內(nèi)蒙古潤(rùn)蒙能源有限公司招聘22人考試筆試備考試題及答案解析
- 虛擬現(xiàn)實(shí)行業(yè) VR 全景拍攝師崗位招聘考試試卷及答案
- 關(guān)于拖拉機(jī)課件
- 江西專(zhuān)升本《信息技術(shù)》核心知識(shí)點(diǎn)考試復(fù)習(xí)題庫(kù)(含答案)
- 2025-2026學(xué)年人教鄂教版三年級(jí)科學(xué)上冊(cè)(全冊(cè))教學(xué)設(shè)計(jì)(附目錄)
- 2025國(guó)家開(kāi)放大學(xué)《小學(xué)語(yǔ)文教學(xué)研究》形考任務(wù)1-5答案
- 回族做禮拜的念詞集合6篇
- 中南大學(xué)輕金屬冶金學(xué)Ⅰ-Mg冶金部分
- 固定資產(chǎn)、低值易耗品報(bào)損流程圖
- 雙橫臂獨(dú)立懸架設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論