《JavaWeb程序設(shè)計(jì)基礎(chǔ)教程》課件第15章_第1頁(yè)
《JavaWeb程序設(shè)計(jì)基礎(chǔ)教程》課件第15章_第2頁(yè)
《JavaWeb程序設(shè)計(jì)基礎(chǔ)教程》課件第15章_第3頁(yè)
《JavaWeb程序設(shè)計(jì)基礎(chǔ)教程》課件第15章_第4頁(yè)
《JavaWeb程序設(shè)計(jì)基礎(chǔ)教程》課件第15章_第5頁(yè)
已閱讀5頁(yè),還剩32頁(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)介

第15章程序調(diào)試

15.1錯(cuò)誤類型

15.2常見(jiàn)編譯錯(cuò)誤

15.3特殊類型的錯(cuò)誤

15.4運(yùn)行時(shí)錯(cuò)誤和邏輯錯(cuò)誤的調(diào)試

15.1錯(cuò)誤類型

15.1.1編譯錯(cuò)誤

編譯錯(cuò)誤主要是語(yǔ)法錯(cuò)誤,發(fā)生這樣的錯(cuò)誤之后,程序根本沒(méi)有辦法運(yùn)行。這些錯(cuò)誤也是最容易解決的問(wèn)題,剛開(kāi)始編寫(xiě)程序時(shí)容易犯這樣的錯(cuò)誤。

編譯錯(cuò)誤主要分為兩類:Java文件中的錯(cuò)誤和JSP文件中的錯(cuò)誤。Java文件中的錯(cuò)誤可以在編譯文件的時(shí)候發(fā)現(xiàn),而JSP文件中的錯(cuò)誤需要在運(yùn)行的時(shí)候才知道,但是現(xiàn)在在一些開(kāi)發(fā)環(huán)境中也支持JSP文件中錯(cuò)誤的動(dòng)態(tài)提示。這些錯(cuò)誤通常可以根據(jù)錯(cuò)誤提示進(jìn)行修改。例如,提示少了“;”號(hào),把分號(hào)加上就可以了。還有一些錯(cuò)誤不容易查找,因?yàn)镴SP程序在運(yùn)行的時(shí)候要轉(zhuǎn)換成Java代碼,而這些錯(cuò)誤并不直接提示原來(lái)的錯(cuò)誤,而是針對(duì)轉(zhuǎn)換后的代碼提示錯(cuò)誤,這樣的錯(cuò)誤不容易查找。

15.1.2運(yùn)行時(shí)錯(cuò)誤

運(yùn)行時(shí)錯(cuò)誤是程序在運(yùn)行的時(shí)候產(chǎn)生的錯(cuò)誤,此時(shí)程序已經(jīng)通過(guò)編譯,并且沒(méi)有語(yǔ)法錯(cuò)誤。例如,運(yùn)行時(shí)要訪問(wèn)的文件不存在,要連接的數(shù)據(jù)庫(kù)不存在等。這些錯(cuò)誤并不是每次運(yùn)行都會(huì)產(chǎn)生,錯(cuò)誤產(chǎn)生本身需要有一些條件。這些錯(cuò)誤通常是由于一些不好的編程習(xí)慣造成的,如果能夠提前對(duì)各種可能的錯(cuò)誤進(jìn)行處理的話,將不會(huì)出現(xiàn)這種錯(cuò)誤。解決的方法主要是進(jìn)行異常處理。

15.1.3邏輯錯(cuò)誤

邏輯錯(cuò)誤不影響程序的執(zhí)行,只是執(zhí)行的結(jié)果不是期望的結(jié)果。這種錯(cuò)誤通常都是因?yàn)榫帉?xiě)的代碼在邏輯上有問(wèn)題,所以稱為邏輯錯(cuò)誤。邏輯錯(cuò)誤比較難定位,多數(shù)時(shí)候需要根據(jù)程序編寫(xiě)人員的經(jīng)驗(yàn)處理。后面主要介紹針對(duì)邏輯錯(cuò)誤的調(diào)試方法。

15.1.4特殊錯(cuò)誤

還有一些比較特殊的錯(cuò)誤,程序本身沒(méi)有問(wèn)題,但是不能運(yùn)行,這時(shí)候通常是程序運(yùn)行的環(huán)境出了問(wèn)題,需要根據(jù)瀏覽器的提示進(jìn)行分別處理。

15.2常見(jiàn)編譯錯(cuò)誤

15.2.1Java文件中的常見(jiàn)編譯錯(cuò)誤

1.符號(hào)錯(cuò)誤

典型的錯(cuò)誤提示如下:

Cannotfindsymbol

symbol:variableXX

location:classXXX

這種類型的錯(cuò)誤包括兩個(gè)方面:變量錯(cuò)誤和類錯(cuò)誤。

如果是變量錯(cuò)誤,可能的原因包括:

●變量沒(méi)有定義而直接使用。

●變量名寫(xiě)錯(cuò)了。

●使用變量的地方已經(jīng)超出了變量的作用范圍。

如果是類錯(cuò)誤,可能的原因包括:

●類名寫(xiě)錯(cuò)了。

●沒(méi)有使用import引入。

2.方法調(diào)用錯(cuò)誤

典型的錯(cuò)誤提示如下:

Cannotfindsymbol

symbol:methodXX

location:classXXX

這種錯(cuò)誤屬于方法調(diào)用錯(cuò)誤,可能的原因包括:

●方法名寫(xiě)錯(cuò)了。

●參數(shù)個(gè)數(shù)不夠。

●參數(shù)類型不匹配。

3.缺少符號(hào)

比較容易缺少的符號(hào)包括分號(hào)、大括號(hào)、小括號(hào)和雙引號(hào)。

(1)缺少分號(hào),一般的提示錯(cuò)誤如下:

“;”expected

在賦值語(yǔ)句比較復(fù)雜,或者方法調(diào)用比較復(fù)雜的時(shí)候容易出現(xiàn)這種錯(cuò)誤。

(2)缺少大括號(hào),提示錯(cuò)誤如下:

“}”expected

(3)缺少小括號(hào),提示信息錯(cuò)誤:

“)”expected

在同一行代碼中嵌套多個(gè)方法調(diào)用的時(shí)候容易產(chǎn)生這樣的錯(cuò)誤。

(4)缺少雙引號(hào),提示信息如下:

unclosedstringliteral

4.缺少返回值類型或者返回語(yǔ)句

在Java中大部分方法都需要返回值類型(構(gòu)造方法不需要返回值),并且如果返回值類型不是void,應(yīng)該有return語(yǔ)句。

如果方法沒(méi)有定義返回值,并且也不是構(gòu)造方法,則會(huì)提示下面的錯(cuò)誤:

invalidmethoddeclaration;returntyperequired

如果方法的返回值不是void,則方法中應(yīng)該有返回值,如果沒(méi)有,則提示信息如下:

missingreturnstatement

有時(shí)候雖然有返回值類型,但是仍然有提示,例如下面的代碼:

publicintmax(inta,intb){

if(a>b)

returna;

if(a<=b)

returnb;

}

這時(shí)候提示錯(cuò)誤主要是因?yàn)橄到y(tǒng)認(rèn)為return語(yǔ)句不一定能執(zhí)行到。

5.類型不匹配

該類錯(cuò)誤指賦值的時(shí)候等號(hào)左右的對(duì)象或者變量類型不匹配,并且不能進(jìn)行自動(dòng)轉(zhuǎn)換。提示信息如下:

incompatibletypes

found:XXX

required:YYY

如果方法的返回值類型和return語(yǔ)句返回的對(duì)象的類型不匹配,則報(bào)錯(cuò)信息是相同的。

6.變量可能沒(méi)有初始化

如果對(duì)一個(gè)沒(méi)有初始化(實(shí)例化)的變量進(jìn)行操作,會(huì)提示下面的錯(cuò)誤:

variableXXmightnothavebeeninitialized

如果賦值過(guò)程是在try語(yǔ)句中進(jìn)行的,也可能會(huì)出現(xiàn)這樣的錯(cuò)誤。

7.沒(méi)有進(jìn)行異常處理

如果要調(diào)用的方法可能會(huì)產(chǎn)生異常,則調(diào)用這個(gè)方法的時(shí)候應(yīng)該進(jìn)行異常處理,如果沒(méi)有處理,會(huì)提示下面的信息:

unreportedexceptionXXX;mustbecaughtordeclaredtobethrown

解決此問(wèn)題的辦法是使用try-catch進(jìn)行處理,也可以在方法聲明中使用throw聲明。

8.語(yǔ)句無(wú)法執(zhí)行到

如果把要執(zhí)行的代碼放在了方法的return語(yǔ)句之后,則系統(tǒng)會(huì)提示下面的信息:

unreachablestatement

9.中文字符

如果在程序中使用了非法字符(字符串中的常量可以使用),則系統(tǒng)會(huì)提示下面的信息:

invalidcharacter

這類錯(cuò)誤通常都是出現(xiàn)了中文字符。常見(jiàn)的中文字符包括分號(hào)、單引號(hào)及雙引號(hào)。

15.2.2JSP文件中的常見(jiàn)編譯錯(cuò)誤

在JSP2.0之后,JSP頁(yè)面主要用于顯示,一般不出現(xiàn)Java代碼。在JSP頁(yè)面中,主要就是對(duì)JSP的標(biāo)簽、表達(dá)式語(yǔ)言和JSTL的使用,所以多數(shù)錯(cuò)誤都是與這些內(nèi)容相關(guān)的。

1.指令屬性不正確

如果標(biāo)簽的指令屬性錯(cuò)誤,則系統(tǒng)提示如下錯(cuò)誤信息:

org.apache.jasper.JasperException:/exceptiontest.jsp(1,1)Pagedirectivehasinvalidattribute:imports

產(chǎn)生錯(cuò)誤的代碼如下:

<%@pageimports="java.util.*"%>

2.指令沒(méi)有正常結(jié)束

如果標(biāo)簽后面缺少結(jié)束符“%>”,則錯(cuò)誤提示如下:

org.apache.jasper.JasperException:/exceptiontest.jsp(2,0)Unterminated<%@pagetag

產(chǎn)生錯(cuò)誤的代碼如下:

<%@pageimports="java.util.*">

如果缺少前面的開(kāi)始標(biāo)志“<%”,則會(huì)把指令顯示在界面上。

3.標(biāo)簽屬性不正確

如果標(biāo)簽的屬性錯(cuò)誤,會(huì)提示如下信息:

org.apache.jasper.JasperException:/exceptiontest.jsp(3,0)AccordingtotheTLDorthetagfile,attributetestismandatoryfortagif

產(chǎn)生錯(cuò)誤的代碼如下:

<c:iftesat="emptyx">

</c:if>

4.標(biāo)簽沒(méi)有正常結(jié)束

JSP中的標(biāo)簽不管是JSP提供的還是自定義的,都必須有結(jié)束標(biāo)志。如果標(biāo)簽沒(méi)有標(biāo)簽體,例如<jsp:forwardpage="目標(biāo)文件"/>,則標(biāo)簽應(yīng)該以“/>”結(jié)束。

如果標(biāo)簽有標(biāo)簽體,例如

<c:iftest="測(cè)試條件">

標(biāo)簽體

</c:if>

則標(biāo)簽必須以“</標(biāo)簽名>”結(jié)束。

如果標(biāo)簽沒(méi)有正常結(jié)束,會(huì)提示如下信息:

org.apache.jasper.JasperException:/exceptiontest.jsp(4,0)Unterminated<c:iftag

5.

JavaBean屬性錯(cuò)誤

在表達(dá)式語(yǔ)言中主要是訪問(wèn)各種隱式對(duì)象,在訪問(wèn)這些對(duì)象的時(shí)候,如果訪問(wèn)了對(duì)象不存在的屬性,則提示下面的信息:

javax.servlet.ServletException:Unabletofindavaluefor"a"inobjectofclass"java.lang.String"usingoperator"."

產(chǎn)生錯(cuò)誤的代碼如下:

<c:forEachvar="i"items="x,y">

${i.a}

</c:forEach> 15.3特殊類型的錯(cuò)誤

15.3.1該頁(yè)無(wú)法顯示

如果沒(méi)有啟動(dòng)服務(wù)器就進(jìn)行訪問(wèn),會(huì)產(chǎn)生如圖15.1

圖15.1服務(wù)無(wú)法訪問(wèn)

遇到這樣的錯(cuò)誤啟動(dòng)服務(wù)器即可。

如果確定服務(wù)器已經(jīng)打開(kāi),還是出現(xiàn)這樣的錯(cuò)誤,則可能是localhost不能解析,可以試著使用訪問(wèn)。

如果還是不能訪問(wèn),可能是服務(wù)器啟動(dòng)失敗,此時(shí)可以查看服務(wù)器的啟動(dòng)信息。如果有控制臺(tái),可以查看控制臺(tái)信息;如果沒(méi)有控制臺(tái),可以查看日志文件。日志文件位于安裝目錄下的logs子目錄下。多數(shù)時(shí)候是因?yàn)槎丝诒徽加谩H绻嵌丝诒徽加?,則提示信息如下:

Addressalreadyinuse:JVM_Bind:8080

在這種情況下,需要關(guān)閉占用這個(gè)端口的其他程序或者修改Tomcat的端口。修改端口的地方是Tomcat安裝目錄下conf子目錄下的server.xml。要修改這個(gè)端口,可使用文本編輯器打開(kāi)并且使用查找功能查找到8080端口所在的代碼,如下面的代碼:

<Connectorport="8080"maxThreads="150"minSpareThreads="25"

maxSpareThreads="75"enableLookups="false"redirectPort="8443"

acceptCount="100"connectionTimeout="20000"disableUploadTimeout="true"/>

把代碼中的8080修改成其他端口即可。

15.3.2找不到文件

啟動(dòng)服務(wù)器之后,訪問(wèn)文件時(shí)報(bào)錯(cuò)信息包含下面的信息:

HTTPStatus404…

說(shuō)明找不到相應(yīng)的資源。造成這種錯(cuò)誤可能有3種原因:第一種原因是因?yàn)閃eb應(yīng)用沒(méi)有正常啟動(dòng);第二種原因是因?yàn)橐L問(wèn)的文件不存在;第三種原因是當(dāng)前文件中訪問(wèn)了其他文件,而要訪問(wèn)的文件不存在。

要解決這個(gè)問(wèn)題,首先要判斷是哪種原因造成的??梢栽囈幌逻@個(gè)Web應(yīng)用中的其他文件是否能訪問(wèn),如果都不能訪問(wèn),說(shuō)明Web應(yīng)用出問(wèn)題了。如果其他的文件能夠訪問(wèn),則當(dāng)前文件名寫(xiě)錯(cuò)了或者文件中要訪問(wèn)的文件不存在。通常文件名比較長(zhǎng)時(shí)容易寫(xiě)錯(cuò)。

如果是Web應(yīng)用出問(wèn)題了,通常是web.xml文件出問(wèn)題,這時(shí)通過(guò)日志文件可以查看錯(cuò)誤的原因。日志文件在tomcat安裝目錄下的logs子目錄中。

15.3.3文件修改后不起作用

文件修改后并沒(méi)有看到想要的效果,即文件的修改沒(méi)有起作用,可能是兩個(gè)方面的原因造成的。第一個(gè)可能的原因是,運(yùn)行時(shí)使用的文件不是最新的文件,是內(nèi)存中運(yùn)行的對(duì)象。第二個(gè)可能的原因是,瀏覽器緩存,即瀏覽器為了提高訪問(wèn)速度,使用了本地的緩存文件,沒(méi)有從服務(wù)器獲取最新文件。

對(duì)于第一種原因,可以采用兩種方法解決。第一種方法是刪除編譯后的臨時(shí)文件(位置在安裝目錄下的work\Catalina\localhost下),即刪除相應(yīng)的應(yīng)用即可。第二種方法是重新啟動(dòng)服務(wù)器。

對(duì)于第二種原因,解決的辦法是:把瀏覽器關(guān)掉,重新打開(kāi)一個(gè)瀏覽器窗口進(jìn)行訪問(wèn)即可。

15.4運(yùn)行時(shí)錯(cuò)誤和邏輯錯(cuò)誤的調(diào)試

調(diào)試程序前需要問(wèn)一下自己“程序運(yùn)行的過(guò)程是否清楚”,如果不清楚,先把程序的流程搞清楚。

下面通過(guò)對(duì)一個(gè)案例的分析來(lái)介紹如果對(duì)邏輯錯(cuò)誤進(jìn)行調(diào)試。

案例:登錄處理。

功能:在登錄處理中,在登錄界面輸入用戶名和口令,然后提交給一個(gè)Servlet處理,Servle接收到登錄信息之后調(diào)用一個(gè)JavaBean進(jìn)行處理,這個(gè)JavaBean訪問(wèn)數(shù)據(jù)庫(kù)進(jìn)行驗(yàn)證,Servlet根據(jù)驗(yàn)證的結(jié)果進(jìn)行處理,如果驗(yàn)證通過(guò)則轉(zhuǎn)向某個(gè)頁(yè)面,如果驗(yàn)證失敗則重新轉(zhuǎn)向登錄界面。

現(xiàn)象:輸入的用戶名和口令與數(shù)據(jù)庫(kù)中的用戶名和口令完全相同,但仍然跳轉(zhuǎn)到登錄界面。

首先要清楚程序的運(yùn)行過(guò)程,下面是涉及的文件及關(guān)鍵點(diǎn):

●登錄界面:輸入用戶信息,點(diǎn)擊提交按鈕把信息提交給Servlet處理。

●?Servlet:接收用戶輸入的信息,然后把得到的信息作為參數(shù),調(diào)用JavaBean進(jìn)行處理,根據(jù)處理的結(jié)果選擇界面對(duì)用戶進(jìn)行響應(yīng)。

●?JavaBean:根據(jù)參數(shù)指定的信息訪問(wèn)數(shù)據(jù)庫(kù),對(duì)用戶信息進(jìn)行驗(yàn)證。如果用戶存在并且口令正確,則返回true;否則,返回false。

這個(gè)過(guò)程清楚之后,分析可能出錯(cuò)的地方。本例中可能出錯(cuò)的地方有:

●輸入界面中輸入元素和提交按鈕不在相同的表單中,這樣用戶輸入的信息是無(wú)法傳遞到服務(wù)器的。如果這樣,后續(xù)驗(yàn)證過(guò)程就沒(méi)有辦法進(jìn)行。

●?Servlet接收信息時(shí)使用的變量名與表單元素的名字不一致,這時(shí)是獲取不到信息的。

●?JavaBean在完成驗(yàn)證過(guò)程時(shí)出錯(cuò),本來(lái)應(yīng)該返回true,但是返回了false。

●?Servlet在轉(zhuǎn)向的時(shí)候發(fā)生錯(cuò)誤,本來(lái)應(yīng)該轉(zhuǎn)向某個(gè)功能頁(yè)面,但是寫(xiě)成登錄界面了。

如果每一步都按照我們的設(shè)計(jì)運(yùn)行,結(jié)果應(yīng)該不會(huì)出錯(cuò),現(xiàn)在出錯(cuò)了,肯定是某個(gè)環(huán)節(jié)出錯(cuò)了。定位錯(cuò)誤分兩步完成:第一步,認(rèn)真分析上面說(shuō)的幾個(gè)地方,看看能不能發(fā)現(xiàn)問(wèn)題,如果不能,進(jìn)入第二步;第二步,需要通過(guò)輸出語(yǔ)句完成,使用輸出語(yǔ)句輸出中間的各種狀態(tài),這樣就可以發(fā)現(xiàn)在什么地方與期望的結(jié)果不一樣。

針對(duì)這個(gè)案例,首先通過(guò)眼睛看,如果沒(méi)有看出,這時(shí)候就需要使用輸出語(yǔ)句進(jìn)行調(diào)試了。

輸出信息可以使用System.o

溫馨提示

  • 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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論