調(diào)試是檢查應(yīng)用程序是否存在錯(cuò)誤的過程。您可以使用以下方法進(jìn)行調(diào)試:在代碼中設(shè)置斷點(diǎn)和監(jiān)視,然后在調(diào)試器中運(yùn)行代碼。您還可以通過逐行執(zhí)行代碼并檢查應(yīng)用程序狀態(tài)來查找任何問題。
IDE 使用 Sun Microsystems JPDA 調(diào)試器來調(diào)試程序。在啟動(dòng)調(diào)試會(huì)話時(shí),所有相關(guān)的調(diào)試器窗口都將自動(dòng)出現(xiàn)在屏幕的底部。您可以調(diào)試整個(gè)項(xiàng)目、任何可執(zhí)行類以及任何 JUnit 測(cè)試。IDE 還允許您通過將調(diào)試器連接到應(yīng)用程序進(jìn)程來調(diào)試在遠(yuǎn)程計(jì)算機(jī)上運(yùn)行的應(yīng)用程序。 運(yùn)行或調(diào)試 Web 應(yīng)用程序、JSP 頁或 Servlet 時(shí),您可以使用 HTTP 監(jiān)視器來監(jiān)視數(shù)據(jù)流。缺省情況下,將出現(xiàn) HTTP 監(jiān)視器,該監(jiān)視器收集有關(guān) Servlet 引擎處理的 HTTP 請(qǐng)求的數(shù)據(jù)。對(duì)于引擎處理的每個(gè) HTTP 請(qǐng)求,監(jiān)視器都會(huì)記錄關(guān)于傳入請(qǐng)求的數(shù)據(jù)、保留在服務(wù)器上的數(shù)據(jù)狀態(tài)和 Servlet 上下文。您可以查看數(shù)據(jù)、為將來的會(huì)話存儲(chǔ)數(shù)據(jù)、重新顯示和編輯以前的請(qǐng)求。有關(guān) HTTP 監(jiān)視器的詳細(xì)信息,請(qǐng)?jiān)谥鞑藛沃羞x擇“幫助”>“幫助內(nèi)容”。 對(duì)于自由格式項(xiàng)目,您必須為“調(diào)試項(xiàng)目”命令編寫一個(gè) Ant 目標(biāo)。您還可以編寫用于調(diào)試特定文件的目標(biāo),并將這些目標(biāo)映射到項(xiàng)目的命令。
基本調(diào)試在此部分,我們將使用一個(gè)簡(jiǎn)單的示例來說明如何啟動(dòng)調(diào)試會(huì)話、如何以手動(dòng)方式逐步執(zhí)行代碼以及如何監(jiān)視變量和方法調(diào)用。我們將在后面的部分介紹更高級(jí)的功能,如設(shè)置斷點(diǎn)和監(jiān)視。 此部分的示例是 Array Fill 應(yīng)用程序。此應(yīng)用程序非常簡(jiǎn)單。它將創(chuàng)建一個(gè) sampleBeans 數(shù)組,每個(gè) Bean 包含兩個(gè)屬性:firstName 和 lastName。然后,它將為每個(gè) Bean 的屬性賦值并輸出這些值。 首先需要運(yùn)行該應(yīng)用程序以確定它是否會(huì)拋出任何異常。下載并提取 ArrayFill 示例的 .zip 歸檔文件 (。要在 IDE 中打開 ArrayFill 項(xiàng)目,請(qǐng)按 CTRL-Shift-O 組合鍵找到提取的 ArrayFill 文件夾,然后單擊“打開項(xiàng)目文件夾”。將在 IDE 中打開 ArrayFill 項(xiàng)目,并可在“項(xiàng)目”窗口中看到該項(xiàng)目的邏輯結(jié)構(gòu)。http://www./files/documents/4/446/ArrayFill.zip) 在“項(xiàng)目”窗口中,展開“源包”下的 arrayfill 包。arrayfill 包包含兩個(gè)類:ArrayFill 和 SampleBean。右鍵單擊 ArrayFill.java,然后按 Shift-F6 組合鍵執(zhí)行它。在“輸出”窗口中出現(xiàn)的輸出應(yīng)該與如下所示類似: java.lang.NullPointerException 啟動(dòng)調(diào)試會(huì)話在 IDE 中啟動(dòng)調(diào)試會(huì)話時(shí),IDE 將編譯所調(diào)試的文件,在調(diào)試模式下運(yùn)行它們,并在調(diào)試器窗口中顯示調(diào)試器輸出。要啟動(dòng)調(diào)試會(huì)話,請(qǐng)選擇要調(diào)試的文件,然后從“運(yùn)行”菜單中選擇以下某個(gè)命令:
如果在 IDE 中打開了多個(gè)項(xiàng)目,請(qǐng)確保使用以下方法將 Array Fill 設(shè)置為主項(xiàng)目:在“項(xiàng)目”窗口中右鍵單擊 ArrayFill 節(jié)點(diǎn),然后從上下文菜單中選擇“設(shè)置主項(xiàng)目”。按 F7 鍵步入主項(xiàng)目的主類。如果未設(shè)置項(xiàng)目的主類,則 IDE 將提示您設(shè)置它。然后,IDE 將在源代碼編輯器中打開文件,顯示“輸出”窗口和調(diào)試器窗口,并剛好在 main 方法內(nèi)部停止。 調(diào)試器窗口讓我們簡(jiǎn)單了解一下調(diào)試器窗口。調(diào)試器窗口在每次啟動(dòng)調(diào)試會(huì)話時(shí)自動(dòng)打開,并在完成會(huì)話時(shí)自動(dòng)關(guān)閉。缺省情況下,IDE 將打開三個(gè)調(diào)試器窗口:“局部變量”窗口、“監(jiān)視”窗口和“調(diào)用棧”窗口。 ![]() 通過從“窗 口”>“調(diào)試”菜單中進(jìn)行選擇,可以打開其他調(diào)試器窗口。如果在調(diào)試會(huì)話過程中打開了調(diào)試器窗口,該窗口將在您完成會(huì)話后自動(dòng)關(guān)閉。如果在未啟動(dòng)調(diào) 試會(huì)話的情況下打開調(diào)試器窗口,該窗口將一直保持打開狀態(tài),直到您手動(dòng)關(guān)閉它。您可以通過將調(diào)試器窗口拖動(dòng)到所需位置來對(duì)其進(jìn)行排列。
逐步執(zhí)行代碼可以使用“運(yùn)行”菜單中的以下命令來控制代碼在調(diào)試器中的執(zhí)行方式:
在本示例中,使用 F7 鍵按一次一行的方式逐步執(zhí)行代碼。loadNames 調(diào)用中出現(xiàn) NullPointerException,因此在步入該調(diào)用時(shí),將在“局部變量”視圖中監(jiān)視 names 數(shù)組的值。每個(gè) Bean 都包含一個(gè) null 值。可以繼續(xù)逐步執(zhí)行 loadNames 方法 - names Bean 始終為 null。 ![]() SampleBean[] myNames=new SampleBean[fnames.length]; 啟動(dòng)包含這些 Bean 的數(shù)組時(shí),它不會(huì)實(shí)例化 Bean 自身。必須添加以下代碼,在 loadNames 方法中實(shí)例化各個(gè) Bean:
使其位于 loadNames 方法中的行 names.setLastName(lnames); 之前。 使用斷點(diǎn)大多數(shù)應(yīng)用程序都太大,從而無法逐行進(jìn)行檢查。通常,在您認(rèn)為會(huì)出現(xiàn)問題的位置設(shè)置一個(gè)斷點(diǎn),然后將應(yīng)用程序運(yùn)行到該位置。您還可以設(shè)置更為專用的斷點(diǎn)(如僅當(dāng)指定條件為 true 時(shí)停止執(zhí)行的條件斷點(diǎn))或適用于某些線程或方法的斷點(diǎn)。 在此節(jié)中,我們將使用上一個(gè)示例中的 ArrayFill 類,因此必須將上面添加的代碼注釋掉以便重現(xiàn)錯(cuò)誤。 設(shè)置斷點(diǎn)如果僅希望設(shè)置簡(jiǎn)單的行斷點(diǎn),則可以單擊所需行的左旁注處。在旁注中將會(huì)出現(xiàn)行斷點(diǎn)圖標(biāo) ( ![]() 對(duì)于更復(fù)雜的斷點(diǎn),請(qǐng)使用“運(yùn)行”菜單中的“新建斷點(diǎn)”(Ctrl-Shift-F8) 命令。“新建斷點(diǎn)”對(duì)話框?qū)⑹鼓軌蜻x擇要?jiǎng)?chuàng)建的斷點(diǎn)類型并設(shè)置斷點(diǎn)選項(xiàng),如中斷條件或斷點(diǎn)輸出到“輸出”窗口的信息。 設(shè)置斷點(diǎn)條件僅當(dāng)指定的布爾表達(dá)式為 true 時(shí),條件斷點(diǎn)才停止執(zhí)行。如果要設(shè)置條件斷點(diǎn),請(qǐng)打開“新建斷點(diǎn)”對(duì)話框,然后在“條件”字段中輸入表達(dá)式。 例如,打開 ArrayFill.java,在 main 方法的 loadNames 方法調(diào)用中設(shè)置插入點(diǎn),然后按 Ctrl-Shift-F8 組合鍵。在該對(duì)話框的“條件”字段中輸入 names!=null 并單擊“確定”。然后按 F5 鍵開始調(diào)試項(xiàng)目。此時(shí)會(huì)在 loadNames 方法內(nèi)中斷程序的執(zhí)行。 定制斷點(diǎn)輸出在“新建斷點(diǎn)”對(duì)話框中,您還可以指定到達(dá)斷點(diǎn)時(shí)打印的信息。請(qǐng)?jiān)趯?duì)話框底部的“打印文本”字段中輸入任何消息。您可以使用變量引用要顯示的某些類型的信息。 斷點(diǎn)類型設(shè)置監(jiān)視通過使用監(jiān)視,可以在應(yīng)用程序執(zhí)行期間跟蹤變量或表達(dá)式值的變化。要設(shè)置監(jiān)視,請(qǐng)?jiān)谠创a編輯器中選擇要設(shè)置監(jiān)視的變量或表達(dá)式,然后單擊鼠標(biāo)右鍵并選擇“新建監(jiān)視”(Ctrl-Shift-F7)。 您還可以在“監(jiān)視”視圖中創(chuàng)建固定監(jiān)視。常規(guī)監(jiān)視描述的是變量的內(nèi)容,而固定監(jiān)視描述的則是當(dāng)前為變量指定的對(duì)象。要?jiǎng)?chuàng)建固定監(jiān)視,請(qǐng)右鍵單擊“局部變量”或“監(jiān)視”視圖中的任意項(xiàng),然后選擇“創(chuàng)建固定監(jiān)視”。 |
|