




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、主題網(wǎng)絡(luò)蜘蛛程序設(shè)計及JAVA實現(xiàn)By Scut祝慶榮 主題網(wǎng)絡(luò)蜘蛛程序設(shè)計及JAVA實現(xiàn)祝慶榮(華南理工大學計算科學與工程學院 廣東 廣州 510640)一、實驗?zāi)康?、掌握spider/crawler的工作原理及實現(xiàn)方法;2、熟悉網(wǎng)頁抓取的整個流程及操作步驟;3、掌握spider/crawler應(yīng)用程序的編寫、調(diào)試和運行;4、掌握主題爬行,內(nèi)容分析技術(shù);二、實驗環(huán)境1、操作系統(tǒng)平臺:Microsoft Windows Vista Ultimate x862、系統(tǒng)配置:處理器:Intel Celeron M processer 1.50GHz內(nèi)存:1280M3、開發(fā)平臺Java 版本信息:j
2、ava version 1.5.0_11Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_11-b03)Java HotSpot(TM) Client VM (build 1.5.0_11-b03, mixed mode, sharing)4、開發(fā)工具:Source Inside Program Editing & Information System version 3.505、幫助文檔:JAVA中文API文檔三、實驗要求1、鎖定某個主題抓??;2、能夠產(chǎn)生日志文本文件,格式為:時間戳(timestamp)、URL;3、
3、抓取某一URL時最多允許建立2個連接(注意:本地作網(wǎng)頁解析的線程數(shù)則不限)4、遵守文明蜘蛛規(guī)則:必須分析robots.txt文件和meta tag有無限制;一個線程抓完一個網(wǎng)頁后要sleep 2秒鐘;5、能對HTML網(wǎng)頁進行解析,提取出鏈接URL,能判別提取的URL是否已處理過,不重復解析已crawl過的網(wǎng)頁;6、能夠?qū)pider/crawler程序的一些基本參數(shù)進行設(shè)置,包括:抓取深度(depth)、種子URL等;7、使用User-agent向服務(wù)器表明自己的身份;8、產(chǎn)生抓取統(tǒng)計信息:包括抓取速度、抓取完成所需時間、抓取網(wǎng)頁總數(shù);重要變量和所有類、方法加注釋;9、請遵守編程規(guī)范,如類、方
4、法、文件等的命名規(guī)范,10、可選:GUI圖形用戶界面、web界面,通過界面管理spider/crawler,包括啟停、URL增刪等四、設(shè)計思路及總體框架從設(shè)計思路上,構(gòu)造Spider有兩種比較常用的方法。第一種是把Spider設(shè)計成一個遞歸的程序,第二種是編寫一個非遞歸的Spider程序,程序維護一個要訪問的網(wǎng)頁列表,考慮到Java對數(shù)組、隊列的包支持較為豐富,實現(xiàn)相對容易,本程序使用了第二種設(shè)計思路。程序中總共維護了四個不同的隊列,它們的總結(jié)如下。每一個這樣的隊列保存著同一處理狀態(tài)的URL。等待隊列 當Spider程序開始處理URL時,它們被傳送到這一隊列。重要的是同一個URL不能被多次處理
5、,因為這樣是浪費的。當一個URL被處理過后,它被移送到或者是錯誤隊列或者是完成隊列。運行隊列 當前正在處理的URL隊列。錯誤隊列 如果在下載當前網(wǎng)頁時發(fā)生錯誤,它的URL將被加入到錯誤隊列。該URL到達這一隊列后將不再移入其它隊列。一旦網(wǎng)頁移入錯誤隊列,Spider程序?qū)⒉粫賹λ鬟M一步處理。完成隊列 如果在下載網(wǎng)頁時沒有發(fā)生錯誤,該URL將被加入到完成隊列。該URL到達這一隊列后將不再移入其他隊列。明顯,每個得到的URL都只能存在于一個隊列中。其狀態(tài)流程圖如下(圖1):圖1 URL狀態(tài)流程圖完成URL錯誤隊列完成隊列運行隊列等待隊列發(fā)現(xiàn)URL以下(圖2)是為本Spider程序設(shè)計的詳細工作
6、流程圖:取給定的主題URL,加入到訓練隊列中是否訓練隊列中是否有URL得到主題詞庫及對應(yīng)權(quán)重(分數(shù))把下載的所有訓練文件分詞統(tǒng)計訓練結(jié)束下載當前主題URL頁面內(nèi)容分數(shù)計算公式如下i,j=Avg(TFi)*(1/(log(nDoc/ni)+1/log(nDoc-1)Avg(TFi):對詞i取其在各文檔中的值進行平均;nDoc:文檔數(shù)目;ni:出現(xiàn)詞i的文檔個數(shù);將此新鏈接移入完成隊列并繼續(xù)等待隊列中是否有URL初始化給定URL,加入到等待隊列中工作結(jié)束取一個URL移入運行隊列,下載頁面此網(wǎng)頁含有其它鏈接嗎查看網(wǎng)頁上的下一個鏈接是否為指向WEB頁面的鏈接報告網(wǎng)頁鏈接報告其它類型鏈接將此新鏈接加入到
7、等待隊列中否是是否是否有META且Name=robots的標簽嗎?否讀取META的Content值是Content值含有”nofollow”嗎?否是robots.txt是有聲明禁止跟蹤此頁嗎否是匹配主題詞,計算得分。讀取此URL的主機根目錄下robots.txt圖2 Spider詳細工作流程五、程序結(jié)構(gòu)及具體實現(xiàn)程序由四個文件組成:CheckLinks.java; HTMLParse.java; ISpiderReportable.java; Spider.java,程序工程報告如下:Project contains 158 symbol records, 780 index entries,
8、 and 6 files.File Size Obj DateCheckLinks.java 9397 - 2007/5/30 CheckLinks 8 javaawt 0 javaio 3 javanet 2 javaxswing 1HTMLParse.java 172 - 2007/4/20 HTMLParse 2 javaxswingtexthtml 0ISpiderReportable.java 195 - 2007/4/20 ISpiderReportable 2 javanet 0Segmenter.java 31413 - 2007/5/29 javaio 1 javalang
9、0 javalangMath 3 javautil 2 segmenter 10Spider.java 17391 - 2007/5/31 javaio 2 javanet 1 javautil 0 javaxswingtext 3 javaxswingtexthtml 4 Spider 12Tf.java 58 - 2007/5/19 tf 2Total Files: 6Total Bytes: 58626Total Symbols: 21它們結(jié)構(gòu)之前的關(guān)系如下各圖: 實現(xiàn)的流程如下,首先,CheckLinks得到一個起始的URL,在CheckLinks.run()中,新建Spider實例,
10、把起始URL加入到等待隊列中,并通過setKeyWord()方法設(shè)置主題詞,setCheckRobots()、setCheckMetaTag()配置選項,程序進入正常工作。Spider通過getWorkloadWaiting()方法得到等待隊列中的URL,調(diào)用processURL()方法對取出的URL進行處理,對此,processURL()方法內(nèi)以URL為地址建立鏈接,取回對象通過parse.parse()方法對HTML進行解釋,主要是從得到的HTML中獲取新的URL并添加到等待隊列中,及對主題字的匹配。經(jīng)過parse返回,則從等待隊列中移走處理的URL,如果沒有錯誤,把它添加到完成隊列中,否
11、則添加到錯誤隊列中,程序又去等待隊列中取出URL,進行同樣的處理流程,循環(huán)一直到等待隊列為空。六、實驗結(jié)果分析實驗結(jié)果分析:包括性能分析如抓取速度(網(wǎng)頁數(shù)/秒)、整個網(wǎng)站抓取總時間、站內(nèi)總共抓取的網(wǎng)頁個數(shù)、站外總共抓取的網(wǎng)頁個數(shù)等,最好圖表說明;運行界面如下圖(圖2)所示:圖3 Spider運行界面以 HYPERLINK 為起點,取以下幾個站點作為訓練站點(均為財經(jīng)內(nèi)容網(wǎng)頁): HYPERLINK /07/0531/04/3FPUCI8R002524SK.html /07/0531/04/3FPUCI8R002524SK.html; HYPERLINK /07/0530/17/3FOQHGN3
12、00251OGL.html /07/0530/17/3FOQHGN300251OGL.html; HYPERLINK /07/0531/03/3FPQLA7H002524SO.html /07/0531/03/3FPQLA7H002524SO.html; HYPERLINK /07/0531/06/3FQ5PBOI002524SJ.html /07/0531/06/3FQ5PBOI002524SJ.html; HYPERLINK /07/0531/06/3FQ5PBOI002524SJ.html /07/0531/06/3FQ5PBOI002524SJ.html; HYPERLINK /07/
13、0530/23/3FPDKOI2002524SS.html /07/0530/23/3FPDKOI2002524SS.html;抓取結(jié)果如下詳見日志文件。由日志文件可見,這些不相關(guān)的頁面的得分大多非常低,最高的也不超過分。同樣,再以 HYPERLINK /fund/ /fund/為起點,抓取的相關(guān)網(wǎng)頁得分都在分以上,爬行效果比較理想。日志文件說明:spiderEvents.log為所有事件日志;spiderResults.log為網(wǎng)頁評分結(jié)果。七、存在問題爬行速度太慢,別是對超鏈接較多的頁面;頁面內(nèi)容的多少對評分有一定影響,雖然不大,但仍需考慮;若能在網(wǎng)頁架構(gòu)分析上添加一定的過濾,抓取核心內(nèi)容
14、,相信對抓取質(zhì)量會有更大的提高,這方面也待改善。附錄資料:如何處理Java異常及常見異常六種異常處理的陋習你覺得自己是一個Java專家嗎?是否肯定自己已經(jīng)全面掌握了Java的異常處理機制?在下面這段代碼中,你能夠迅速找出異常處理的六個問題嗎? 1 OutputStreamWriter out = . 2 java.sql.Connection conn = . 3 try / 4 Statement stat = conn.createStatement(); 5 ResultSet rs = stat.executeQuery( 6 select uid, name from user);
15、7 while (rs.next() 8 9 out.println(ID: + rs.getString(uid) / 10 ,姓名: + rs.getString(name); 11 12 conn.close(); / 13 out.close(); 14 15 catch(Exception ex) / 16 17 ex.printStackTrace(); /, 18 作為一個Java程序員,你至少應(yīng)該能夠找出兩個問題。但是,如果你不能找出全部六個問題,請繼續(xù)閱讀本文。 本文討論的不是Java異常處理的一般性原則,因為這些原則已經(jīng)被大多數(shù)人熟知。我們要做的是分析各種可稱為“反例”(a
16、nti-pattern)的違背優(yōu)秀編碼規(guī)范的常見壞習慣,幫助讀者熟悉這些典型的反面例子,從而能夠在實際工作中敏銳地察覺和避免這些問題。 反例之一:丟棄異常 代碼:15行-18行。 這段代碼捕獲了異常卻不作任何處理,可以算得上Java編程中的殺手。從問題出現(xiàn)的頻繁程度和禍害程度來看,它也許可以和C/C+程序的一個惡名遠播的問題相提并論?不檢查緩沖區(qū)是否已滿。如果你看到了這種丟棄(而不是拋出)異常的情況,可以百分之九十九地肯定代碼存在問題(在極少數(shù)情況下,這段代碼有存在的理由,但最好加上完整的注釋,以免引起別人誤解)。 這段代碼的錯誤在于,異常(幾乎)總是意味著某些事情不對勁了,或者說至少發(fā)生了某
17、些不尋常的事情,我們不應(yīng)該對程序發(fā)出的求救信號保持沉默和無動于衷。調(diào)用一下printStackTrace算不上“處理異?!?。不錯,調(diào)用printStackTrace對調(diào)試程序有幫助,但程序調(diào)試階段結(jié)束之后, printStackTrace就不應(yīng)再在異常處理模塊中擔負主要責任了。 丟棄異常的情形非常普遍。打開JDK的ThreadDeath類的文檔,可以看到下面這段說明:“特別地,雖然出現(xiàn)ThreadDeath是一種正常的情形,但ThreadDeath類是Error而不是Exception的子類,因為許多應(yīng)用會捕獲所有的Exception然后丟棄它不再理睬?!边@段話的意思是,雖然ThreadDea
18、th代表的是一種普通的問題,但鑒于許多應(yīng)用會試圖捕獲所有異常然后不予以適當?shù)奶幚恚訨DK把 ThreadDeath定義成了Error的子類,因為Error類代表的是一般的應(yīng)用不應(yīng)該去捕獲的嚴重問題??梢?,丟棄異常這一壞習慣是如此常見,它甚至已經(jīng)影響到了Java本身的設(shè)計。 那么,應(yīng)該怎樣改正呢?主要有四個選擇: 1、處理異常。針對該異常采取一些行動,例如修正問題、提醒某個人或進行其他一些處理,要根據(jù)具體的情形確定應(yīng)該采取的動作。再次說明,調(diào)用printStackTrace算不上已經(jīng)“處理好了異?!薄?2、重新拋出異常。處理異常的代碼在分析異常之后,認為自己不能處理它,重新拋出異常也不失為一
19、種選擇。 3、把該異常轉(zhuǎn)換成另一種異常。大多數(shù)情況下,這是指把一個低級的異常轉(zhuǎn)換成應(yīng)用級的異常(其含義更容易被用戶了解的異常)。 4、不要捕獲異常。 結(jié)論一:既然捕獲了異常,就要對它進行適當?shù)奶幚怼2灰东@異常之后又把它丟棄,不予理睬。 反例之二:不指定具體的異常 代碼:15行。 許多時候人們會被這樣一種“美妙的”想法吸引:用一個catch語句捕獲所有的異常。最常見的情形就是使用catch(Exception ex)語句。但實際上,在絕大多數(shù)情況下,這種做法不值得提倡。為什么呢? 要理解其原因,我們必須回顧一下catch語句的用途。catch語句表示我們預(yù)期會出現(xiàn)某種異常,而且希望能夠處理該異
20、常。異常類的作用就是告訴 Java編譯器我們想要處理的是哪一種異常。由于絕大多數(shù)異常都直接或間接從java.lang.Exception派生,catch (Exception ex)就相當于說我們想要處理幾乎所有的異常。 再來看看前面的代碼例子。我們真正想要捕獲的異常是什么呢?最明顯的一個是SQLException,這是JDBC操作中常見的異常。另一個可能的異常是IOException,因為它要操作OutputStreamWriter。顯然,在同一個catch塊中處理這兩種截然不同的異常是不合適的。如果用兩個catch塊分別捕獲SQLException和IOException就要好多了。這就是
21、說,catch語句應(yīng)當盡量指定具體的異常類型,而不應(yīng)該指定涵蓋范圍太廣的Exception類。 另一方面,除了這兩個特定的異常,還有其他許多異常也可能出現(xiàn)。例如,如果由于某種原因,executeQuery返回了null,該怎么辦?答案是讓它們繼續(xù)拋出,即不必捕獲也不必處理。實際上,我們不能也不應(yīng)該去捕獲可能出現(xiàn)的所有異常,程序的其他地方還有捕獲異常的機會?直至最后由JVM處理。 結(jié)論二:在catch語句中盡可能指定具體的異常類型,必要時使用多個catch。不要試圖處理所有可能出現(xiàn)的異常。 反例之三:占用資源不釋放 代碼:3行-14行。 異常改變了程序正常的執(zhí)行流程。這個道理雖然簡單,卻常常被人
22、們忽視。如果程序用到了文件、Socket、JDBC連接之類的資源,即使遇到了異常,也要正確釋放占用的資源。為此,Java提供了一個簡化這類操作的關(guān)鍵詞finally。 finally是樣好東西:不管是否出現(xiàn)了異常,F(xiàn)inally保證在try/catch/finally塊結(jié)束之前,執(zhí)行清理任務(wù)的代碼總是有機會執(zhí)行。遺憾的是有些人卻不習慣使用finally。 當然,編寫finally塊應(yīng)當多加小心,特別是要注意在finally塊之內(nèi)拋出的異常?這是執(zhí)行清理任務(wù)的最后機會,盡量不要再有難以處理的錯誤。 結(jié)論三:保證所有資源都被正確釋放。充分運用finally關(guān)鍵詞。反例之四:不說明異常的詳細信息 代
23、碼:3行-18行。 仔細觀察這段代碼:如果循環(huán)內(nèi)部出現(xiàn)了異常,會發(fā)生什么事情?我們可以得到足夠的信息判斷循環(huán)內(nèi)部出錯的原因嗎?不能。我們只能知道當前正在處理的類發(fā)生了某種錯誤,但卻不能獲得任何信息判斷導致當前錯誤的原因。 printStackTrace的堆棧跟蹤功能顯示出程序運行到當前類的執(zhí)行流程,但只提供了一些最基本的信息,未能說明實際導致錯誤的原因,同時也不易解讀。 因此,在出現(xiàn)異常時,最好能夠提供一些文字信息,例如當前正在執(zhí)行的類、方法和其他狀態(tài)信息,包括以一種更適合閱讀的方式整理和組織printStackTrace提供的信息。 結(jié)論四:在異常處理模塊中提供適量的錯誤原因信息,組織錯誤信
24、息使其易于理解和閱讀。 反例之五:過于龐大的try塊 代碼:3行-14行。 經(jīng)??梢钥吹接腥税汛罅康拇a放入單個try塊,實際上這不是好習慣。這種現(xiàn)象之所以常見,原因就在于有些人圖省事,不愿花時間分析一大塊代碼中哪幾行代碼會拋出異常、異常的具體類型是什么。把大量的語句裝入單個巨大的try塊就象是出門旅游時把所有日常用品塞入一個大箱子,雖然東西是帶上了,但要找出來可不容易。 一些新手常常把大量的代碼放入單個try塊,然后再在catch語句中聲明Exception,而不是分離各個可能出現(xiàn)異常的段落并分別捕獲其異常。這種做法為分析程序拋出異常的原因帶來了困難,因為一大段代碼中有太多的地方可能拋出Ex
25、ception。 結(jié)論五:盡量減小try塊的體積。 反例之六:輸出數(shù)據(jù)不完整 代碼:7行-11行。 不完整的數(shù)據(jù)是Java程序的隱形殺手。仔細觀察這段代碼,考慮一下如果循環(huán)的中間拋出了異常,會發(fā)生什么事情。循環(huán)的執(zhí)行當然是要被打斷的,其次, catch塊會執(zhí)行?就這些,再也沒有其他動作了。已經(jīng)輸出的數(shù)據(jù)怎么辦?使用這些數(shù)據(jù)的人或設(shè)備將收到一份不完整的(因而也是錯誤的)數(shù)據(jù),卻得不到任何有關(guān)這份數(shù)據(jù)是否完整的提示。對于有些系統(tǒng)來說,數(shù)據(jù)不完整可能比系統(tǒng)停止運行帶來更大的損失。 較為理想的處置辦法是向輸出設(shè)備寫一些信息,聲明數(shù)據(jù)的不完整性;另一種可能有效的辦法是,先緩沖要輸出的數(shù)據(jù),準備好全部數(shù)據(jù)
26、之后再一次性輸出。 結(jié)論六:全面考慮可能出現(xiàn)的異常以及這些異常對執(zhí)行流程的影響。 改寫后的代碼 根據(jù)上面的討論,下面給出改寫后的代碼。也許有人會說它稍微有點?嗦,但是它有了比較完備的異常處理機制。 OutputStreamWriter out = . java.sql.Connection conn = . try Statement stat = conn.createStatement(); ResultSet rs = stat.executeQuery( select uid, name from user); while (rs.next() out.println(ID: + rs
27、.getString(uid) + ,姓名: + rs.getString(name); catch(SQLException sqlex) out.println(警告:數(shù)據(jù)不完整); throw new ApplicationException(讀取數(shù)據(jù)時出現(xiàn)SQL錯誤, sqlex); catch(IOException ioex) throw new ApplicationException(寫入數(shù)據(jù)時出現(xiàn)IO錯誤, ioex); finally if (conn != null) try conn.close(); catch(SQLException sqlex2) System.
28、err(this.getClass().getName() + .mymethod - 不能關(guān)閉數(shù)據(jù)庫連接: + sqlex2.toString(); if (out != null) try out.close(); catch(IOException ioex2) System.err(this.getClass().getName() + .mymethod - 不能關(guān)閉輸出文件 + ioex2.toString(); 本文的結(jié)論不是放之四海皆準的教條,有時常識和經(jīng)驗才是最好的老師。如果你對自己的做法沒有百分之百的信心,務(wù)必加上詳細、全面的注釋。 另一方面,不要笑話這些錯誤,不妨問問你自
29、己是否真地徹底擺脫了這些壞習慣。即使最有經(jīng)驗的程序員偶爾也會誤入歧途,原因很簡單,因為它們確確實實帶來了“方便”。所有這些反例都可以看作Java編程世界的惡魔,它們美麗動人,無孔不入,時刻誘惑著你。也許有人會認為這些都屬于雞皮蒜毛的小事,不足掛齒,但請記住:勿以惡小而為之,勿以善小而不為。下面是一些 java異常集 算術(shù)異常類:ArithmeticExecption空指針異常類:NullPointerException類型強制轉(zhuǎn)換異常:ClassCastException數(shù)組負下標異常:NegativeArrayException數(shù)組下標越界異常:ArrayIndexOutOfBoundsEx
30、ception違背安全原則異常:SecturityException文件已結(jié)束異常:EOFException文件未找到異常:FileNotFoundException字符串轉(zhuǎn)換為數(shù)字異常:NumberFormatException操作數(shù)據(jù)庫異常:SQLException輸入輸出異常:IOException方法未找到異常:NoSuchMethodExceptionjava.lang.AbstractMethodError抽象方法錯誤。當應(yīng)用試圖調(diào)用抽象方法時拋出。java.lang.AssertionError斷言錯。用來指示一個斷言失敗的情況。java.lang.ClassCircularit
31、yError類循環(huán)依賴錯誤。在初始化一個類時,若檢測到類之間循環(huán)依賴則拋出該異常。java.lang.ClassFormatError類格式錯誤。當Java虛擬機試圖從一個文件中讀取Java類,而檢測到該文件的內(nèi)容不符合類的有效格式時拋出。java.lang.Error錯誤。是所有錯誤的基類,用于標識嚴重的程序運行問題。這些問題通常描述一些不應(yīng)被應(yīng)用程序捕獲的反常情況。java.lang.ExceptionInInitializerError初始化程序錯誤。當執(zhí)行一個類的靜態(tài)初始化程序的過程中,發(fā)生了異常時拋出。靜態(tài)初始化程序是指直接包含于類中的static語句段。java.lang.Ille
32、galAccessError違法訪問錯誤。當一個應(yīng)用試圖訪問、修改某個類的域(Field)或者調(diào)用其方法,但是又違反域或方法的可見性聲明,則拋出該異常。java.lang.IncompatibleClassChangeError不兼容的類變化錯誤。當正在執(zhí)行的方法所依賴的類定義發(fā)生了不兼容的改變時,拋出該異常。一般在修改了應(yīng)用中的某些類的聲明定義而沒有對整個應(yīng)用重新編譯而直接運行的情況下,容易引發(fā)該錯誤。java.lang.InstantiationError實例化錯誤。當一個應(yīng)用試圖通過Java的new操作符構(gòu)造一個抽象類或者接口時拋出該異常.java.lang.InternalError內(nèi)
33、部錯誤。用于指示Java虛擬機發(fā)生了內(nèi)部錯誤。java.lang.LinkageError鏈接錯誤。該錯誤及其所有子類指示某個類依賴于另外一些類,在該類編譯之后,被依賴的類改變了其類定義而沒有重新編譯所有的類,進而引發(fā)錯誤的情況。java.lang.NoClassDefFoundError未找到類定義錯誤。當Java虛擬機或者類裝載器試圖實例化某個類,而找不到該類的定義時拋出該錯誤。java.lang.NoSuchFieldError域不存在錯誤。當應(yīng)用試圖訪問或者修改某類的某個域,而該類的定義中沒有該域的定義時拋出該錯誤。java.lang.NoSuchMethodError方法不存在錯誤。
34、當應(yīng)用試圖調(diào)用某類的某個方法,而該類的定義中沒有該方法的定義時拋出該錯誤。java.lang.OutOfMemoryError內(nèi)存不足錯誤。當可用內(nèi)存不足以讓Java虛擬機分配給一個對象時拋出該錯誤。java.lang.StackOverflowError堆棧溢出錯誤。當一個應(yīng)用遞歸調(diào)用的層次太深而導致堆棧溢出時拋出該錯誤。java.lang.ThreadDeath線程結(jié)束。當調(diào)用Thread類的stop方法時拋出該錯誤,用于指示線程結(jié)束。java.lang.UnknownError未知錯誤。用于指示Java虛擬機發(fā)生了未知嚴重錯誤的情況。java.lang.UnsatisfiedLinkEr
35、ror未滿足的鏈接錯誤。當Java虛擬機未找到某個類的聲明為native方法的本機語言定義時拋出。java.lang.UnsupportedClassVersionError不支持的類版本錯誤。當Java虛擬機試圖從讀取某個類文件,但是發(fā)現(xiàn)該文件的主、次版本號不被當前Java虛擬機支持的時候,拋出該錯誤。java.lang.VerifyError驗證錯誤。當驗證器檢測到某個類文件中存在內(nèi)部不兼容或者安全問題時拋出該錯誤。java.lang.VirtualMachineError虛擬機錯誤。用于指示虛擬機被破壞或者繼續(xù)執(zhí)行操作所需的資源不足的情況。java.lang.ArithmeticExce
36、ption算術(shù)條件異常。譬如:整數(shù)除零等。java.lang.ArrayIndexOutOfBoundsException數(shù)組索引越界異常。當對數(shù)組的索引值為負數(shù)或大于等于數(shù)組大小時拋出。java.lang.ArrayStoreException數(shù)組存儲異常。當向數(shù)組中存放非數(shù)組聲明類型對象時拋出。java.lang.ClassCastException類造型異常。假設(shè)有類A和B(A不是B的父類或子類),O是A的實例,那么當強制將O構(gòu)造為類B的實例時拋出該異常。該異常經(jīng)常被稱為強制類型轉(zhuǎn)換異常。java.lang.ClassNotFoundException找不到類異常。當應(yīng)用試圖根據(jù)字符串形
37、式的類名構(gòu)造類,而在遍歷CLASSPAH之后找不到對應(yīng)名稱的class文件時,拋出該異常。java.lang.CloneNotSupportedException不支持克隆異常。當沒有實現(xiàn)Cloneable接口或者不支持克隆方法時,調(diào)用其clone()方法則拋出該異常。java.lang.EnumConstantNotPresentException枚舉常量不存在異常。當應(yīng)用試圖通過名稱和枚舉類型訪問一個枚舉對象,但該枚舉對象并不包含常量時,拋出該異常。java.lang.Exception根異常。用以描述應(yīng)用程序希望捕獲的情況。java.lang.IllegalAccessException
38、違法的訪問異常。當應(yīng)用試圖通過反射方式創(chuàng)建某個類的實例、訪問該類屬性、調(diào)用該類方法,而當時又無法訪問類的、屬性的、方法的或構(gòu)造方法的定義時拋出該異常。java.lang.IllegalMonitorStateException違法的監(jiān)控狀態(tài)異常。當某個線程試圖等待一個自己并不擁有的對象(O)的監(jiān)控器或者通知其他線程等待該對象(O)的監(jiān)控器時,拋出該異常。java.lang.IllegalStateException違法的狀態(tài)異常。當在Java環(huán)境和應(yīng)用尚未處于某個方法的合法調(diào)用狀態(tài),而調(diào)用了該方法時,拋出該異常。java.lang.IllegalThreadStateException違法的線
39、程狀態(tài)異常。當縣城尚未處于某個方法的合法調(diào)用狀態(tài),而調(diào)用了該方法時,拋出異常。java.lang.IndexOutOfBoundsException索引越界異常。當訪問某個序列的索引值小于0或大于等于序列大小時,拋出該異常。java.lang.InstantiationException實例化異常。當試圖通過newInstance()方法創(chuàng)建某個類的實例,而該類是一個抽象類或接口時,拋出該異常。java.lang.InterruptedException被中止異常。當某個線程處于長時間的等待、休眠或其他暫停狀態(tài),而此時其他的線程通過Thread的interrupt方法終止該線程時拋出該異常。j
40、ava.lang.NegativeArraySizeException數(shù)組大小為負值異常。當使用負數(shù)大小值創(chuàng)建數(shù)組時拋出該異常。java.lang.NoSuchFieldException屬性不存在異常。當訪問某個類的不存在的屬性時拋出該異常。java.lang.NoSuchMethodException方法不存在異常。當訪問某個類的不存在的方法時拋出該異常。java.lang.NullPointerException空指針異常。當應(yīng)用試圖在要求使用對象的地方使用了null時,拋出該異常。譬如:調(diào)用null對象的實例方法、訪問null對象的屬性、計算null對象的長度、使用throw語句拋出n
41、ull等等。java.lang.NumberFormatException數(shù)字格式異常。當試圖將一個String轉(zhuǎn)換為指定的數(shù)字類型,而該字符串確不滿足數(shù)字類型要求的格式時,拋出該異常。java.lang.RuntimeException運行時異常。是所有Java虛擬機正常操作期間可以被拋出的異常的父類。java.lang.SecurityException安全異常。由安全管理器拋出,用于指示違反安全情況的異常。java.lang.StringIndexOutOfBoundsException字符串索引越界異常。當使用索引值訪問某個字符串中的字符,而該索引值小于0或大于等于序列大小時,拋出該異
42、常。java.lang.TypeNotPresentException類型不存在異常。當應(yīng)用試圖以某個類型名稱的字符串表達方式訪問該類型,但是根據(jù)給定的名稱又找不到該類型是拋出該異常。該異常與 ClassNotFoundException的區(qū)別在于該異常是unchecked(不被檢查)異常,而ClassNotFoundException 是checked(被檢查)異常。java.lang.UnsupportedOperationException不支持的方法異常。指明請求的方法不被支持情況的異常。異常javax.servlet.jsp.JspException: Cannot retrieve
43、 mapping for action /Login (/Login是你的action名字) 可能原因action沒有再struts-config.xml 中定義,或沒有找到匹配的action,例如在JSP文件中使用 html:form action=Login.do.將表單提交給Login.do處理,如果出現(xiàn)上述異常,請查看struts-config.xml中的定義部分,有時可能是打錯了字符或者是某些不符合規(guī)則,可以使用strutsconsole工具來檢查。異常org.apache.jasper.JasperException: Cannot retrieve definition for
44、form bean null可能原因 這個異常是因為Struts根據(jù)struts-config.xml中的mapping沒有找到action期望的form bean。大部分的情況可能是因為在form-bean中設(shè)置的name屬性和action中設(shè)置的name屬性不匹配所致。換句話說,action和 form都應(yīng)該各自有一個name屬性,并且要精確匹配,包括大小寫。這個錯誤當沒有name屬性和action關(guān)聯(lián)時也會發(fā)生,如果沒有在action 中指定name屬性,那么就沒有name屬性和action相關(guān)聯(lián)。當然當action制作某些控制時,譬如根據(jù)參數(shù)值跳轉(zhuǎn)到相應(yīng)的jsp頁面,而不是處理表單數(shù)據(jù)
45、,這是就不用name屬性,這也是action的使用方法之一。異常No action instance for path /xxxx could be created可能原因特別提示:因為有很多中情況會導致這個錯誤的發(fā)生,所以推薦大家調(diào)高你的web服務(wù)器的日志/調(diào)試級別,這樣可以從更多的信息中看到潛在的、在試圖創(chuàng)建 action類時發(fā)生的錯誤,這個action類你已經(jīng)在struts-config.xml中設(shè)置了關(guān)聯(lián)(即添加了標簽)。在struts-config.xml中通過action標簽的class屬性指定的action類不能被找到有很多種原因,例如:定位編譯后的. class文件失敗。Fai
46、lure to place compiled .class file for the action in the classpath (在web開發(fā)中,class的的位置在r WEB-INF/classes,所以你的action class必須要在這個目錄下。例如你的action類位于WEB-INF/classes/action/Login.class,那么在struts -config.xml中設(shè)置action的屬性type時就是action.Login).拼寫錯誤,這個也時有發(fā)生,并且不易找到,特別注意第一個字母的大小寫和包的名稱。 異常javax.servlet.jsp.JspExcep
47、tion: No getter method for property username of bean org.apache.struts.taglib.html.BEAN可能原因沒有位form bean中的某個變量定義getter 方法這個錯誤主要發(fā)生在表單提交的FormBean中,用struts標記時,在FormBean中必須有一個getUsername()方法。注意字母“U”。異常java.lang.NoClassDefFoundError: org/apache/struts/action/ActionForm可能原因這個錯誤主要發(fā)生在在classpath中找不到相應(yīng)的Java .c
48、lass文件。如果這個錯誤發(fā)生在web應(yīng)用程序的運行時,主要是因為指定的class文件不在web server的classpath中(/WEB-INF/classes 和 /WEB-INF/lib)。在上面的錯誤中,原因是找不到ActionForm類。異常javax.servlet.jsp.JspException: Exception creating bean of class org.apache.struts.action.ActionForm: 1可能原因Instantiating Struts-provided ActionForm class directly instead o
49、f instantiating a class derived off ActionForm. This mightoccur implicitly if you specify that a form-bean is this Struts ActionForm class rather than specifying a child of this classfor the form-bean.Not associating an ActionForm-descended class with an action can also lead to this error.異常javax.se
50、rvlet.jsp.JspException: Cannot find ActionMappings or ActionFormBeans collection可能原因不是標識Struts actionServlet的標記就是映射.do擴展名的標記或者兩者都沒有在web.xml中聲明。在struts-config.xml中的打字或者拼寫錯誤也可導致這個異常的發(fā)生。例如缺少一個標記的關(guān)閉符號/。最好使用struts console工具檢查一下。另外,load-on-startup必須在web.xml中聲明,這要么是一個空標記,要么指定一個數(shù)值,這個數(shù)值用來表servlet運行的優(yōu)先級,數(shù)值越大優(yōu)
51、先級越低。還有一個和使用load-on-startup有關(guān)的是使用Struts預(yù)編譯JSP文件時也可能導致這個異常。異常java.lang.NullPointerException at org.apache.struts.util.RequestUtils.forwardURL(RequestUtils.java:1223)可能原因在struts-config.xml中的forward元素缺少path屬性。例如應(yīng)該是如下形式:異常javax.servlet.jsp.JspException: Cannot find bean org.apache.struts.taglib.html.BEA
52、N in any scope Probable Causes試圖在Struts的form標記外使用form的子元素。這常常發(fā)生在你在后面使用Struts的html標記。另外要注意可能你不經(jīng)意使用的無主體的標記,如,這樣web 服務(wù)器解析時就當作一個無主體的標記,隨后使用的所有標記都被認為是在這個標記之外的,如又使用了還有就是在使用taglib引入HTML標記庫時,你使用的prefix的值不是html。異常javax.servlet.jsp.JspException: Missing message for key xx.xx.xxProbable Causes這個key的值對沒有在資源文件Ap
53、plicationRperties中定義。如果你使用eclipse時經(jīng)常碰到這樣的情況,當項目重新編譯時,eclipse會自動將classes目錄下的資源文件刪除。資源文件ApplicationRperties 不在classpath中應(yīng)將資源文件放到 WEB-INF/classes 目錄下,當然要在struts-config.xml中定義)異常Cannot find message resources under key org.apache.struts.action.MESSAGE可能原因很顯然,這個錯誤是發(fā)生在使用資源文件時,而Struts沒有找到資源文件。Implicitly try
54、ing to use message resources that are not available (such as using empty html:options tag instead of specifyingthe options in its body - this assumes options are specified in ApplicationRperties file)XML parser issues - too many, too few, incorrect/incompatible versions異常Strange and seemingly random
55、 characters in HTML and on screen, but not in original JSP or servlet.可能原因混和使用Struts的html:form標記和標準的HTML標記不正確。使用的編碼樣式在本頁中不支持。異常Document contained no data in NetscapeNo data rendered (completely empty) page in Microsoft Internet Explorer可能原因使用一個Action的派生類而沒有實現(xiàn)perform()方法或execute()方法。在Struts1.0中實現(xiàn)的是pe
56、rform()方法,在 Struts1.1中實現(xiàn)的是execute()方法,但Struts1.1向后兼容perform()方法。但你使用Struts1.1創(chuàng)建一個 Action的派生類,并且實現(xiàn)了execute()方法,而你在Struts1.0中運行的話,就會得到Document contained nodata error message in Netscape or a completely empty (no HTML whatsoever) page rendered in Microsoft Internet Explorer.”的錯誤信息。異常ServletException: B
57、eanUtils.populate解決方案在用Struts上傳文件時,遇到了javax.servlet.ServletException: BeanUtils.populate異常。我的ActionServlet并沒有用到BeanUtils這些工具類。后來仔細檢查代碼發(fā)現(xiàn)是在jsp文件里的form忘了加enctype= multipart/form-data 了。所以寫程序遇到錯誤或異常應(yīng)該從多方面考慮問題存在的可能性,想到系統(tǒng)提示信息以外的東西。1. 定義Action后, 如果指定了name, 那么必須要定義一個與它同名的FormBean才能進行form映射.2. 如果定義Action后,
58、提交頁面時出現(xiàn) No input attribute for mapping path. 錯誤, 則需要在其input屬性中定義轉(zhuǎn)向的頁面.3. 如果插入新的數(shù)據(jù)時出現(xiàn) Batch update row count wrong:. 錯誤, 則說明XXX.hbm.xml中指定的key的類型為原始類型(int, long),因為這種類型會自動分配值, 而這個值往往會讓系統(tǒng)認為已經(jīng)存在該記錄, 正確的方法是使用java.lang.Integer或java.lang.Long對象.4. 如果插入數(shù)據(jù)時出現(xiàn) argument type mismatch 錯誤, 可能是你使用了Date等特殊對象, 因為s
59、truts不能自動從String型轉(zhuǎn)換成Date型,所以, 你需要在Action中手動把String型轉(zhuǎn)換成Date型.5. Hibernate中, Query的iterator()比list()方法快很多.6. 如果出現(xiàn) equal symbol expected 錯誤, 說明你的strtus標簽中包含另一個標簽或者變量, 例如:html:select property=test onchange=/或者html:hidden property=test value=/這樣的情況. 錯誤:Exception in thread main org.hibernate.exception.SQL
60、GrammarException: Could not execute JDBC batch update原因與解決: 因為Hibernate Tools(或者Eclipse本身的Database Explorer)生成*.hbn.xml工具中包含有catalog=*(*表示數(shù)據(jù)庫名稱)這樣的屬性,將該屬性刪除就可以了錯誤:org.hibernate.ObjectDeletedException: deleted object would be re-saved by cascade (remove deleted object from associations)原因與解決:方法1 刪除Se
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025至2030年中國太湖蟹數(shù)據(jù)監(jiān)測研究報告
- 2025至2030年中國中號吸通數(shù)據(jù)監(jiān)測研究報告
- 山西省太原市多校2024-2025學年高一下學期開學考試化學試題
- Unit 1 My day 單元試卷含答案含聽力原文無聽力音頻
- 2025年軍隊文職人員招聘之軍隊文職公共科目綜合檢測試卷B卷含答案
- 2024河北省中考英語真題【原卷版】
- 重大事件公關(guān)管理合同(2篇)
- 金子抵押合同(2篇)
- (一診)2025年蘭州市高三診斷考試歷史試卷(含答案)
- 電子商務(wù)平臺交易額及客戶評價統(tǒng)計表
- 小學語文新課標基礎(chǔ)型學習任務(wù)群解讀及教學建議
- 鋁合金型材檢測原始記錄
- 07施工試驗計劃
- 數(shù)字邏輯習題以及習題答案課件
- 骶尾部藏毛竇的診治課件
- 門診病歷書寫模板全
- 幼兒教師職業(yè)道德完整全套教學課件
- G基站審批一件事流程圖
- 《零基礎(chǔ)玩轉(zhuǎn)小紅書:吃透爆款邏輯漲粉、變現(xiàn)不再難》
- 圍術(shù)期下肢深靜脈血栓預(yù)防的術(shù)中護理
- GB/T 12996-2012電動輪椅車
評論
0/150
提交評論