翻譯|使用教程|編輯:吳園園|2020-05-28 14:36:37.007|閱讀 308 次
概述:調(diào)試器是功能強大且用途廣泛的工具,可在受控環(huán)境中執(zhí)行程序。使用調(diào)試器,您可以查看應(yīng)用程序的內(nèi)部狀態(tài),查找錯誤,理解代碼以及執(zhí)行許多其他操作。
# 界面/圖表報表/文檔/IDE等千款熱門軟控件火熱銷售中 >>
IntelliJ IDEA是Java語言開發(fā)的集成環(huán)境,IntelliJ在業(yè)界被公認(rèn)為優(yōu)秀的Java開發(fā)工具之一,尤其在智能代碼助手、代碼自動提示、重構(gòu)、J2EE支持、Ant、JUnit、CVS整合、代碼審查、 創(chuàng)新的GUI設(shè)計等方面的功能可以說是超常的。IntelliJ IDEA 現(xiàn)已加入在線訂購,點擊此處了解價格詳情>>
如果您曾經(jīng)System.out.println()調(diào)試過代碼,那么這篇文章是必讀的。
調(diào)試器是一種特殊的工具,可用于在嚴(yán)格控制的環(huán)境中執(zhí)行代碼。它使您可以查看和分析應(yīng)用程序的內(nèi)部狀態(tài),并發(fā)現(xiàn)并修復(fù)可能隱藏在代碼深處的錯誤。
使用調(diào)試器,您還可以更改和測試代碼的行為而無需修改源代碼,并且還可以執(zhí)行許多其他有趣的事情。讓我們邁入調(diào)試世界的第一步,看看該工具的功能。
點擊查看:IntelliJ IDEA(2020)中的調(diào)試器基礎(chǔ)視頻教程
在調(diào)試模式下執(zhí)行代碼
為控制臺應(yīng)用程序啟動調(diào)試器很簡單。讓我們使用以下示例代碼進行演示:
package com.jetbrains; import java.io.IOException; import java.util.ArrayList; import java.util.List; public class CoordinatesCopy { public static void main(String[] args) throws IOException { List<Point> lineCoordinates = createCoordinateList(); outputValues(lineCoordinates); Point p = new Point(13, 30); removeValue(lineCoordinates, p); outputValues(lineCoordinates); } private static void outputValues(List<Point> lineCoordinates) { System.out.println("Output values..."); for (Point p : lineCoordinates) { System.out.println(p); } } private static void removeValue(List<Point> lineCoordinates, Point p) { lineCoordinates.remove(p); } private static List<Point> createCoordinateList() { ArrayList<Point> list = new ArrayList<>(); list.add(new Point(12, 20)); list.add(new Point(13, 30)); return list; } }
有多種啟動調(diào)試器的方法:
1、您可以單擊裝訂線區(qū)域中的“運行”圖標(biāo),然后選擇“調(diào)試”選項。
2、您可以使用Alt + Enter調(diào)用類或main方法上的上下文操作,然后選擇Debug操作。
3、您也可以從“運行”菜單或按Shift F9來啟動它。
您可以編輯運行配置以添加虛擬機選項或?qū)?shù)傳遞給程序。
暫停,恢復(fù),重新啟動或停止調(diào)試器
如果您的應(yīng)用程序似乎無響應(yīng),則可以暫停程序以分析代碼的阻塞位置。讓我們修改上一節(jié)中的main方法,如下所示:
public static void main(String[] args) throws IOException { List<Point> lineCoordinates = createCoordinateList(); outputValues(lineCoordinates); Point p = new Point(13, 30); int y = System.in.read(); // execution pauses here removeValue(lineCoordinates, p); outputValues(lineCoordinates); }
在調(diào)試模式下執(zhí)行您的應(yīng)用程序。如果不輸入值,則您的應(yīng)用程序似乎無響應(yīng)。此代碼可能很容易理解,但并非所有代碼庫都這么簡單。
在“調(diào)試”窗口中,單擊“ 暫停程序”,然后編輯器窗口將顯示您的應(yīng)用程序當(dāng)前正在執(zhí)行或已阻止的類和方法。在此示例中,您可以看到該代碼已被用戶輸入阻止,從而在編輯器中顯示了相關(guān)的類和方法。您還可以查看調(diào)用堆棧。通過單擊調(diào)用堆棧中的方法調(diào)用,可以在編輯器窗口中查看相應(yīng)的類和方法。
您可以通過單擊“ 恢復(fù)程序”或使用快捷鍵F9 來恢復(fù)程序執(zhí)行。要以調(diào)試模式重新啟動程序,請選擇Rerun。您可以隨時使用“ 停止”圖標(biāo)停止調(diào)試程序。
注意,在這種情況下,我沒有設(shè)置任何斷點。
斷點
斷點將停止程序的執(zhí)行,以便您可以分析代碼的狀態(tài)。
要在一行代碼上設(shè)置斷點,請在裝訂線區(qū)域中單擊,或使用快捷鍵Ctrl + F8(Win / Linux)或?F8(macOS)。如果不想每次到達斷點都停止執(zhí)行,可以為斷點定義一個條件。例如,讓我們在方法outputValues()中在輸出變量值的代碼行中添加一個斷點,p并定義一個條件,以y在引用變量的字段p等于時停止執(zhí)行代碼30。
您也可以將斷點拖放到裝訂線中,然后將其移至另一行代碼。默認(rèn)情況下,單擊裝訂線中的斷點圖標(biāo)將其刪除(您可以在“設(shè)置” |“首選項”中修改默認(rèn)行為)。但是,如果您已經(jīng)為斷點定義了條件或其他參數(shù),則可能更希望在單擊斷點時將其禁用而不是刪除。您可以通過右鍵單擊斷點圖標(biāo)并選擇“禁用”來執(zhí)行此操作。勾號表示該行代碼有信息,而叉號表示此斷點上沒有信息。
要檢查斷點及其條件如何工作,請執(zhí)行此博客中包含的示例代碼(在調(diào)試模式下)。你會看到,當(dāng)字段的值這一計劃將暫停y變量p是30。
斷點還有更多。您可以右鍵單擊裝訂線中的斷點圖標(biāo),然后單擊“更多”。在打開的對話框中,您可以修改斷點,以使其不暫停程序執(zhí)行,而在到達時記錄表達式。讓我們記錄該類的xand y字段的值,Point然后重新運行我們的代碼?,F(xiàn)在,代碼執(zhí)行不會在斷點處停止–而是將我們定義的表達式記錄到控制臺。
調(diào)試窗口
當(dāng)您的應(yīng)用程序在斷點處暫停執(zhí)行時,調(diào)試窗口將顯示重要信息,例如框架,線程,控制臺窗口,步驟操作圖標(biāo),變量窗格等:
如果錯誤地關(guān)閉了調(diào)試窗口,則始終可以使用快捷鍵Alt + 5(Win / Linux)或?5(macOS)重新打開它。與往常一樣,有多種方法可以訪問“調(diào)試窗口”。您還可以使用“在任何地方搜索”功能(快捷方式:Shift + Shift),使用“ 查找操作”(對于Win / Linux快捷方式為Ctrl + Shift + A,對于macOS為?A)以及通過搜索“調(diào)試”來訪問它。 。
您的應(yīng)用程序在調(diào)試模式下完成執(zhí)行后,您還可以查看調(diào)試窗口。您不僅可以使用調(diào)試窗口在調(diào)試模式下瀏覽代碼,還可以使用它來查看程序中的所有斷點,使其靜音并進一步修改它們的功能。
在繼續(xù)進行用于調(diào)試應(yīng)用程序的步驟操作之前,讓我們了解本示例中使用的示例應(yīng)用程序。
示例應(yīng)用程序概述
本文章中使用的代碼很簡單。該方法createCoOrdinateList()創(chuàng)建Point該類的兩個實例,并將它們添加到中ArrayList。該Point班有兩個字段,x并且y,和getter和setter方法。該outputValues()方法將傳遞的列表項輸出到控制臺。下一行代碼創(chuàng)建一個Point實例,該removeValue()方法嘗試將其從lineCoordinates列表中刪除。
執(zhí)行此代碼時,即使在將Pointwith x和yvalues 13并30添加到列表中時,您也會在輸出中看到,當(dāng)創(chuàng)建另一個具有相同值的實例以將其刪除時,它不會成功。讓我們調(diào)試代碼。
要調(diào)試代碼,您需要了解可用于遍歷代碼以查找錯誤的各種步驟操作。
步驟動作
有多種方法可以在調(diào)試模式下瀏覽代碼。例如,您可能希望執(zhí)行一行代碼而不必?fù)?dān)心所調(diào)用方法的細(xì)節(jié)?;蛘?,當(dāng)您從應(yīng)用程序,庫或API中調(diào)用另一個方法時,您可能更希望查看執(zhí)行哪幾行代碼。您可以通過各種步驟操作來執(zhí)行此操作。
在調(diào)試模式下啟動應(yīng)用程序之前,請設(shè)置一個斷點。各種步驟操作是:
讓我們使用所有前面的操作來調(diào)試Coordinates類。我們將通過加強在代碼中的行啟動main()方法,步入removeValues()方法,和力步入remove()的方法ArrayList類和equals()檢查方法怎樣的值lineCoordinates列表被參考變量的值進行比較p,以便可以從列表中刪除匹配的值。如果在調(diào)試時前進到一行代碼,則可以使用Drop Frame從調(diào)用堆棧中刪除一幀并返回到調(diào)用方法。
在示例應(yīng)用程序中,我們發(fā)現(xiàn)“錯誤”是由該equals()方法比較值的方式引起的。僅當(dāng)引用匹配時才返回true,如果引用的對應(yīng)字段值匹配則不返回true。
現(xiàn)在,讓我們重新運行代碼,并檢查其是否按預(yù)期工作。啟動應(yīng)用程序并查看結(jié)果。
現(xiàn)在一切看起來都很好。我們設(shè)法找到一個錯誤并予以修復(fù)!
如果您要切換類并閱讀代碼,而錯過了代碼執(zhí)行的位置,則可以單擊Show Execution Point。要逐行跳過執(zhí)行代碼,可以前進到一行并單擊Run to Cursor。
變量窗格
內(nèi)聯(lián)調(diào)試器非常有用,因為它在您逐步執(zhí)行代碼時會在編輯器中顯示變量的值。但是,“變量”窗格顯示了更多詳細(xì)信息。
在此示例中,由于我們沒有覆蓋該類的toString()方法Point,因此編輯器窗口顯示了類名和調(diào)試器對象ID,這似乎并沒有太大幫助。調(diào)試器窗格顯示變量的所有字段,包括私有字段。
單擊堆棧將向我們顯示與該堆棧相關(guān)的變量。
您可以右鍵單擊變量,然后選擇“ 跳轉(zhuǎn)到源(F4)”以查看聲明該變量的位置,以更好地理解您的代碼。通過選擇選項“ 跳轉(zhuǎn)到類型源(Shift + F4)”,您還可以查看非基本變量的定義。
在調(diào)用堆棧中,您可能需要評估一個表達式以驗證您的假設(shè)。例如,我可以評估的值this可變,或其他有效的表達式,如this兩倍等于的實例Point類,或者this是.equals()到的一個實例Point的類。
您可以通過添加新的監(jiān)視來創(chuàng)建一個變量,該變量的值可在所有調(diào)用堆棧中訪問。說,System.getProperty然后使用您的操作系統(tǒng)的名稱。
您可以創(chuàng)建監(jiān)視以查看所有調(diào)用堆棧中某些變量的值。有多種方法可以做到這一點。您可以在編輯器中的代碼上單擊鼠標(biāo)右鍵,然后選擇添加到手表。在“變量”窗格中,您也可以單擊變量并將其拖放到“監(jiān)視”窗格中。
這些變量的值可能并非在所有調(diào)用堆棧中都可用。它實際上取決于變量的范圍。
修改代碼行為
您是否知道可以更改代碼的行為而無需更改其源代碼?這也適用于另一個API或框架定義的代碼。
在此代碼執(zhí)行中,要比較的實例的x和y字段Point相等,并且此equals()方法將返回true。我們可以通過在變量窗格中右鍵單擊并選擇Set Value…來更改變量的值。當(dāng)我們這樣做時,代碼的行為就會改變。使用修改后的值,該equals()方法將返回,false并且不會從中刪除該值A(chǔ)rrayList。
====================================================
想要了解或購買IntelliJ IDEA正版授權(quán)的朋友,歡迎
JetBrain技術(shù)交流群現(xiàn)已開通,QQ搜索群號“786598704”或者掃描下方二維碼即可加入
本站文章除注明轉(zhuǎn)載外,均為本站原創(chuàng)或翻譯。歡迎任何形式的轉(zhuǎn)載,但請務(wù)必注明出處、不得修改原文相關(guān)鏈接,如果存在內(nèi)容上的異議請郵件反饋至chenjj@ke049m.cn
文章轉(zhuǎn)載自: