《JavaWeb程序設(shè)計(jì)基礎(chǔ)教程》課件第12章_第1頁(yè)
《JavaWeb程序設(shè)計(jì)基礎(chǔ)教程》課件第12章_第2頁(yè)
《JavaWeb程序設(shè)計(jì)基礎(chǔ)教程》課件第12章_第3頁(yè)
《JavaWeb程序設(shè)計(jì)基礎(chǔ)教程》課件第12章_第4頁(yè)
《JavaWeb程序設(shè)計(jì)基礎(chǔ)教程》課件第12章_第5頁(yè)
已閱讀5頁(yè),還剩26頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論