




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第12章對(duì)系統(tǒng)異常進(jìn)行處理12.1異常處理概述
12.2Java代碼中的異常處理
12.3JSP頁(yè)面中的異常處理
小結(jié)
習(xí)題12實(shí)訓(xùn)12:圖書管理功能的異常處理
12.1異常處理概述
Web應(yīng)用包含的文件主要有Java文件、頁(yè)面文件、配置文件。通常配置文件不會(huì)出錯(cuò),而Java文件和頁(yè)面文件比較容易出錯(cuò)。另外可能會(huì)出現(xiàn)一些與文件無(wú)關(guān)的錯(cuò)誤,例如用戶輸入了不存在的文件名等。
Java文件中可能出現(xiàn)的異常如下:
(1)調(diào)用其他方法產(chǎn)生的異常。Java文件中主要的功能是調(diào)用其他的方法,所以異常主要是調(diào)用這些方法時(shí)產(chǎn)生的。例如,連接數(shù)據(jù)庫(kù)、執(zhí)行數(shù)據(jù)庫(kù)操作、訪問文件、把字符串轉(zhuǎn)換成數(shù)字等,這些方法可能都會(huì)產(chǎn)生異常。所以在調(diào)用這些方法時(shí),必須知道這些方法可能會(huì)產(chǎn)生什么異常。這些方法可能會(huì)產(chǎn)生什么異常,當(dāng)前文件就可能會(huì)產(chǎn)生什么異常。
(2)不好的編程習(xí)慣造成的異常。Java文件中還有可能產(chǎn)生的異常包括數(shù)組越界、NullPointerException等異常,這些異常主要是因?yàn)榫帉懘a的習(xí)慣不好造成的。對(duì)于這種異常,通常在編寫代碼的時(shí)候增加一些判斷就可以避免。
(3)應(yīng)用異常。在Java文件中還有一類比較特殊的異常,例如要對(duì)年齡賦值,但是參數(shù)是300,雖然不會(huì)產(chǎn)生錯(cuò)誤,但是它確實(shí)是異常。
頁(yè)面中主要是HTML代碼和JSP標(biāo)簽,通常都是JSP標(biāo)簽在執(zhí)行時(shí)出現(xiàn)異常。在頁(yè)面中可以使用page標(biāo)簽對(duì)異常進(jìn)行處理,另外在標(biāo)準(zhǔn)標(biāo)簽庫(kù)中提供的<c:catch>標(biāo)簽也可以對(duì)異常進(jìn)行處理。實(shí)際上這個(gè)處理過程與Java中的異常處理過程非常類似,只是采用標(biāo)簽來(lái)實(shí)現(xiàn)。
對(duì)于那些沒有辦法在文件中進(jìn)行處理的異常,可以通過Web應(yīng)用的配置文件web.xml進(jìn)行處理。
12.2Java代碼中的異常處理
12.2.1不好的編程習(xí)慣造成的異常
對(duì)于數(shù)組越界、NullPointerException等異常,需要在編寫程序的時(shí)候仔細(xì)檢查。如果養(yǎng)成良好的編程習(xí)慣,這種異常應(yīng)該可以避免。也就是在訪問數(shù)組或者對(duì)象之前,應(yīng)該對(duì)數(shù)組或者對(duì)象進(jìn)行分析,看看會(huì)不會(huì)產(chǎn)生異常。
例如,要訪問數(shù)組可以先判斷數(shù)組的下標(biāo)是否小于數(shù)組的元素個(gè)數(shù)。對(duì)于對(duì)象方法的調(diào)用,可以先看看對(duì)象是否是null,如果是null,就不調(diào)用,這樣就不會(huì)產(chǎn)生NullPointerException。
12.2.2特殊類型的異常
對(duì)于比較特殊的不能進(jìn)行處理的異常,需要拋給方法的調(diào)用者處理。例如前面提到的對(duì)年齡賦值的代碼:
publicvoidsetAge(intage)
{
this.age=age;
}該代碼沒有對(duì)可能的異常進(jìn)行處理,如果用戶調(diào)用這個(gè)方法的時(shí)候使用的參數(shù)不是一個(gè)合適的值,該方法也可以成功執(zhí)行,但這是不正確的。
之所以產(chǎn)生異常,是因?yàn)榉椒ǖ恼{(diào)用者沒有使用正確的參數(shù)。當(dāng)前方法是沒有辦法處理的,所以只能把異常拋給方法的調(diào)用者。下面的代碼是修改后的代碼:
publicvoidsetAge(intage)throwsException
{
if(age>0&&age<120)
this.age=age;
else
thrownewException("年齡值不合法!");
}12.2.3方法調(diào)用產(chǎn)生的異常
對(duì)于調(diào)用其他方法產(chǎn)生的異常,可以使用try-catch-finally結(jié)構(gòu)進(jìn)行處理。不管調(diào)用哪個(gè)方法,首先要明確可能會(huì)產(chǎn)生哪些異常,然后根據(jù)這些異常進(jìn)行處理。假設(shè)上面的setAge方法的參數(shù)是字符串,這樣在賦值的時(shí)候就需要把字符串轉(zhuǎn)換成數(shù)字,可以使用Integer類的parseInt方法,這個(gè)方法在執(zhí)行的過程中就可能會(huì)產(chǎn)生異常,異常的類型是java.lang.NumberFormatException。
如果不進(jìn)行異常處理,setAge方法可以寫成:
publicvoidsetAge(Stringage){
this.age=Integer.parseInt(age);
}
如果要進(jìn)行異常處理,可以寫成下面的代碼:
publicvoidsetAge(Stringage){
try{
this.age=Integer.parseInt(age);
}catch(NumberFormatExceptione)
{…
}
}代碼中增加了try-catch語(yǔ)句,把可能會(huì)出現(xiàn)異常的代碼放在try語(yǔ)句中,catch后的小括號(hào)中是可能會(huì)產(chǎn)生的異常的類型,在catch后面的大擴(kuò)號(hào)中是產(chǎn)生異常之后要執(zhí)行的代碼。這樣在產(chǎn)生異常的時(shí)候,異常就會(huì)被捕獲,就會(huì)執(zhí)行catch后面的大擴(kuò)號(hào)中的代碼,產(chǎn)生異常的代碼后的代碼就不會(huì)再執(zhí)行了。如果不產(chǎn)生異常,catch后面的代碼是不會(huì)執(zhí)行的。
有時(shí)希望某些代碼總要執(zhí)行,不管是否產(chǎn)生異常。此時(shí)可以使用finally語(yǔ)句,寫在try-catch的后面,例如下面的代碼:
publicvoidsetAge(Stringage){
try{
this.age=Integer.parseInt(age);
}catch(NumberFormatExceptione){
}finally{…
}
}在這個(gè)方法中,雖然能夠?qū)Ξ惓_M(jìn)行處理,但是如果產(chǎn)生異常了,那么這個(gè)賦值是不成功的。但是對(duì)于方法的調(diào)用者來(lái)說(shuō)是不知道的,所以現(xiàn)在的處理方法還不合理。為了讓方法的調(diào)用者能夠知道異常,需要把異常再次拋出,拋出異常的過程與前面介紹的相同。下面是修改后的代碼:
publicvoidsetAge(Stringage)throwsException
{
try{
this.age=Integer.parseInt(age);
}catch(NumberFormatExceptione){
thrownewException("年齡不是數(shù)字!");
}finally{…
}
}當(dāng)然并不是所有的異常都需要在捕獲之后再次拋出,而是需要根據(jù)實(shí)際情況來(lái)確定。
進(jìn)一步地,如果在對(duì)異常進(jìn)行處理的過程中,系統(tǒng)的異常類型不能滿足我們的要求,則可以自定義異常類型。另外,在系統(tǒng)產(chǎn)生異常的時(shí)候需要把異常信息寫入到日志文件中,這樣維護(hù)人員可以根據(jù)異常信息對(duì)系統(tǒng)進(jìn)行維護(hù)。
12.3JSP頁(yè)面中的異常處理
12.3.1使用<c:catch>進(jìn)行異常處理
<c:catch>標(biāo)簽可以針對(duì)特定的一行或者多行代碼。<c:catch>標(biāo)簽的基本格式如下:
<c:catch[var="存儲(chǔ)異常信息的變量"]>
其他的JSP代碼,包括各種標(biāo)簽
</c:catch>
其用法與Java代碼中的try語(yǔ)句非常類似。把可能產(chǎn)生異常的代碼放在<c:catch>開始標(biāo)志和結(jié)束標(biāo)志之間。這樣,當(dāng)這些代碼產(chǎn)生異常的時(shí)候,JSP容器會(huì)對(duì)異常進(jìn)行處理。
下面是一個(gè)對(duì)界面異常進(jìn)行處理的例子:
<c:catch>
<c:outvalue="${user.address}"/>
</c:catch>
如果希望產(chǎn)生異常之后把異常信息保存起來(lái),供其他的代碼使用,可以使用var屬性指定一個(gè)變量。
下面的代碼會(huì)在異常產(chǎn)生時(shí)把異常信息存儲(chǔ)在exceptionInfo變量中:
<c:catchvar="exceptionInfo">
<c:outvalue="${user.address}"/>
</c:catch>
如果需要在后面輸出異常的信息,可以使用下列代碼:
<c:iftest="${exceptionInfo!=null}">
運(yùn)行時(shí)候產(chǎn)生異常,異常信息為:${exceptionInfo.message}
</c:if>12.3.2為頁(yè)面指定異常處理文件
如果不想針對(duì)每一段代碼都進(jìn)行異常處理,可以以頁(yè)面作為單位進(jìn)行異常處理,即可以指定當(dāng)前頁(yè)面運(yùn)行過程中產(chǎn)生異常時(shí),由特定的頁(yè)面對(duì)異常進(jìn)行處理。
采用這種異常處理方式,需要編寫一個(gè)專門的異常處理文件,然后在每個(gè)需要進(jìn)行異常處理的文件中進(jìn)行設(shè)置。
1.編寫異常處理文件
異常處理文件中需要使用page指令的isErrorPage屬性,格式如下:
<%@pageisErrorPage="true"%>
如果在頁(yè)面上進(jìn)行了這樣的設(shè)置,頁(yè)面就具有了一項(xiàng)特殊的功能,即能夠訪問異常對(duì)象exception。exception是JSP的內(nèi)部對(duì)象,當(dāng)頁(yè)面在運(yùn)行過程中產(chǎn)生異常時(shí),它會(huì)被拋出。該對(duì)象包含了異常信息。
下面是一個(gè)異常處理文件(文件名為errorPage.jsp):
<%@pagecontentType=“text/html;charset=gb2312”%>
<%@pageisErrorPage=“true”%>
頁(yè)面產(chǎn)生異常,異常信息如下:
${exception.message}
2.為頁(yè)面指定異常處理文件
要想讓頁(yè)面產(chǎn)生異常時(shí),由專門的異常處理文件對(duì)異常進(jìn)行處理,需要在該頁(yè)面中使用page指令的errorPage指定專門的異常處理文件,格式如下:
<%@pageerrorPage="異常處理文件"%>
假設(shè)要設(shè)置前面編寫的errorPage.jsp頁(yè)面為當(dāng)前頁(yè)面的異常處理文件,可以使用下面的代碼:
<%@pageerrorPage="errorPage.jsp"%>
12.3.3通過web.xml進(jìn)行配置
如果不想為每個(gè)頁(yè)面設(shè)置異常處理文件,可以為同一種類型的異常指定統(tǒng)一的異常處理文件。還有一些異常的處理是沒有辦法通過頁(yè)面設(shè)置來(lái)完成的,例如用戶輸入了網(wǎng)站中的一個(gè)不存在的文件,這時(shí)候應(yīng)該告訴用戶文件不存在,但是這種異常是沒有辦法通過在頁(yè)面設(shè)置來(lái)解決的。
要想為每種類型的異常指定一個(gè)異常處理文件,可以根據(jù)錯(cuò)誤類型,通過web.xml進(jìn)行配置,例如NullPointException、IOException等,也可以根據(jù)異常編碼配置。
常見的異常編碼如下:
403錯(cuò)誤:文件被禁止訪問;
404錯(cuò)誤:文件沒有找到;
500錯(cuò)誤:文件在運(yùn)行過程中發(fā)生未知錯(cuò)誤。
根據(jù)異常類型進(jìn)行配置,可以使用下面的代碼:
<error>
<exception-type>java.lang.NullPointerException</exception-type>
<location>/nullpointer.jsp</location>
</error>根據(jù)異常編碼進(jìn)行配置,可以使用下面的代碼:
<error>
<error-code>401</error-code>
<location>/401.jsp</location>
</error>
小
結(jié)
本章首先對(duì)可能出現(xiàn)的異常進(jìn)行了分析,然后介紹了處理異常的多種方法。
對(duì)于Java中的異常,如果是調(diào)用其他方法產(chǎn)生的異常,可以使用try-catch進(jìn)行處理。如果需要把異常告訴當(dāng)前方法的調(diào)用者,可以通過throw拋出異常,并通過throws聲明這個(gè)異常。
對(duì)于界面中的某些標(biāo)簽可能產(chǎn)生的異常,可以通過標(biāo)準(zhǔn)標(biāo)簽庫(kù)的<c:catch>標(biāo)簽進(jìn)行處理,只要把可能出現(xiàn)異常的標(biāo)簽放在<c:catch>標(biāo)簽內(nèi)部即可。如果需要在其他地方使用這個(gè)異常信息,還可以在<c:catch>中使用var指定一個(gè)變量來(lái)保存異常信息。
如果要為某個(gè)頁(yè)面指定一個(gè)異常處理文件,可以使用page標(biāo)簽的errorPage標(biāo)簽。專門的異常處理文件需要聲明page標(biāo)簽的isErrorPage屬性為true,這樣當(dāng)頁(yè)面產(chǎn)生異常時(shí),系統(tǒng)會(huì)調(diào)用指定的專用的異常處理文件。
如果要為整個(gè)網(wǎng)站配置一些異常處理文件的話,可以在web.xml中進(jìn)行配置,可以根據(jù)異常類型配置,也可以根據(jù)異常的編碼進(jìn)行配置。這樣不管是某個(gè)文件發(fā)生異常,還是與文件無(wú)關(guān)的異常都可以被處理。
習(xí)
題
12
1.在Java代碼中可能會(huì)產(chǎn)生哪些類型的異常,通常如何處理?
2.對(duì)于JSP頁(yè)面中的異常,有哪些方法可以進(jìn)行處理?
3.為了防止用戶訪問一個(gè)不存在的文件而產(chǎn)生異常,應(yīng)該如何進(jìn)行設(shè)置?
4.如果希望在a.jsp文件出錯(cuò)的時(shí)候,由
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 大學(xué)預(yù)防艾滋病活動(dòng)策劃書
- 大學(xué)老鄉(xiāng)聚會(huì)邀請(qǐng)函
- 小兒腹瀉補(bǔ)液課件
- 大學(xué)生招聘會(huì)學(xué)習(xí)總結(jié)
- 大學(xué)生勤工儉學(xué)演講稿
- 大學(xué)畢業(yè)聯(lián)歡會(huì)活動(dòng)策劃書
- 小兒臍風(fēng)散課件
- 備戰(zhàn)期末考試的演講稿
- 如何取消費(fèi)用委托協(xié)議合同
- 二手貨物收購(gòu)合同協(xié)議書
- 醫(yī)藥公司團(tuán)建活動(dòng)方案
- 變電站一次設(shè)備培訓(xùn)
- 橋下渣土處置方案(3篇)
- 2025年 杭州市余杭區(qū)衛(wèi)生健康系統(tǒng)招聘醫(yī)學(xué)類專業(yè)畢業(yè)生筆試考試試卷附答案
- 利用乳酸菌半固態(tài)發(fā)酵提升糙米食用感官與營(yíng)養(yǎng)品質(zhì)的研究
- 船體搶修方案(3篇)
- 智人遷徙路徑重構(gòu)-洞察及研究
- 關(guān)于醫(yī)院“十五五”發(fā)展規(guī)劃(2026-2030)
- 生物多樣性保護(hù)與利用專項(xiàng)債項(xiàng)目可行性研究報(bào)告
- 吊橋浮橋安全管理制度
- T/CCSAS 023-2022危險(xiǎn)化學(xué)品企業(yè)緊急切斷閥設(shè)置和使用規(guī)范
評(píng)論
0/150
提交評(píng)論