IDEA Debug 高階技巧,老手都是這么玩的~~
共 5777字,需瀏覽 12分鐘
·
2024-11-12 12:20
無需魔法,國內(nèi)可直接使用官方ChatGPT-4(Plus)、ChatGPT-4o!
來源:juejin.cn/post/7308539123537592357
-
目錄 -
引言 -
Debug基礎(chǔ) -
高階技巧-條件斷點 -
條件斷點應(yīng)用場景 -
如何添加條件斷點 -
條件斷點對于閱讀源碼的幫助 -
高階技巧-計算器 -
查看變量值 -
修改變量值 -
測試表達式 -
執(zhí)行方法調(diào)用:
目錄
引言
IntelliJ IDEA,由JetBrains(捷克共和國)開發(fā)的一款強大的Java集成開發(fā)環(huán)境(IDE),因其豐富的功能、智能的代碼輔助以及用戶友好的界面設(shè)計,在全球范圍內(nèi)廣受Java開發(fā)者的喜愛,在國內(nèi),筆者遇到過不使用IDEA的Java程序員不超過三個。不僅限于Java,IntelliJ IDEA還支持多種其他編程語言和框架,如Kotlin、Scala、Groovy以及Android開發(fā)等,這進一步擴大了其用戶基礎(chǔ)。其社區(qū)版是免費的,而專業(yè)版則提供了更為高級的功能。
Debug(調(diào)試)是軟件開發(fā)中不可或缺的一個環(huán)節(jié)。它使開發(fā)者能夠逐行執(zhí)行代碼,檢查運行時的狀態(tài),包括變量值、內(nèi)存占用、線程狀態(tài)等,從而幫助開發(fā)者理解代碼的實際行為,定位并修復(fù)錯誤。良好的調(diào)試工具可以顯著提高問題解決的效率,減少猜測工作,幫助開發(fā)者構(gòu)建更加穩(wěn)定、高效的軟件系統(tǒng)。
對了,最近我整理了上百本電子書/軟件/視頻以及面試題,還在持續(xù)更新中,全部免費,文檔地址:
https://r86oxhhvu2.feishu.cn/wiki/ZMq0wjeFFiRRbvk9NeFcf7uknsJ
在本文中,我將向大家介紹及演示IDEA的高階Debug技巧,包含但不限于:
-
條件斷點(Conditional breakpoint): 允許開發(fā)者設(shè)置特定條件,只有當(dāng)這些條件滿足時,程序才會在這些斷點處暫停執(zhí)行。這對于調(diào)試復(fù)雜的循環(huán)和分支邏輯尤其有用,因為它可以讓你聚焦于特定的執(zhí)行路徑或案例。 -
計算器(Evaluate Expression): 這個功能允許開發(fā)者在調(diào)試會話中計算表達式的值,不僅可以查看變量的當(dāng)前值,還可以執(zhí)行表達式,甚至調(diào)用方法。這對于驗證假設(shè)和測試代碼更改而無需重新啟動整個調(diào)試會話非常有用。
Debug基礎(chǔ)
寫一段代碼,開啟調(diào)試:
| 操作 | Windows | Mac(OS X) |
|---|---|---|
| 進入下一步,如果當(dāng)前行斷點是一個方法,則不進入當(dāng)前方法體內(nèi) | F8 | F8(Fn) |
| 進入下一步,如果當(dāng)前行斷點是一個方法,則進入當(dāng)前方法體內(nèi), 如果該方法體還有方法,則不會進入該內(nèi)嵌的方法中 | F7 | F7(Fn) |
| 智能步入,斷點所在行上有多個方法調(diào)用,會彈出進入哪個方法 | Shift + F7 | ?F7 (Fn) |
| 智能跳出 | Shift + F8 | ?F8 (Fn) |
| 恢復(fù)程序運行,如果該斷點下面代碼還有斷點則停在下一個斷點上 | F9 | F9(Fn) |
| 運行到光標(biāo)處,如果光標(biāo)前有其他斷點會進入到該斷點 | Alt + F9 | ?F9(Fn) |
| 計算表達式(可以更改變量值使其生效) | Alt + F8 | ?F8 (Fn) |
| 切換斷點(若光標(biāo)當(dāng)前行有斷點則取消斷點,沒有則加上斷點) | Ctrl + F8 | ?F8 (Fn) |
| 查看斷點信息 | Ctrl + Shift + F8 | ??F8 (Fn) |
高階技巧-條件斷點
我們構(gòu)造一個List<User>用來模擬從數(shù)據(jù)庫查詢出列表,第三個元素id=3中的age屬性是null,我們在for循環(huán)中使用加法來觸發(fā)Integer類型的拆箱來出發(fā)空指針異常。
public class IDEATest {
public static void main(String[] args) {
List<User> userList = new ArrayList<>(6);
userList.add(new User(1, "Tom", 19));
userList.add(new User(2, "Giles", 25));
userList.add(new User(3, "Alex", null));
userList.add(new User(4, "Ryan", 21));
userList.add(new User(5, "DongGe", 19));
userList.add(new User(6, "RUI", 21));
userList.forEach(user -> {
String name = user.getName();
int futureAge = user.getAge() + 10;
System.out.println(name + " 10年后" + futureAge + "歲");
});
}
}
@Data
@AllArgsConstructor
@NoArgsConstructor
class User {
private Integer id;
private String name;
private Integer age;
}
可以看到IDEA提示了第25行代碼報了錯,我們定位到第25行代碼內(nèi)容:
為了定位問題,我們在第25行打個斷點:
null + 10
在Java中,null是一個字面量,用來表示沒有任何對象與之關(guān)聯(lián)的引用。而+操作符在Java中主要有兩種用途:一是作為數(shù)學(xué)加法運算符,用于基本數(shù)據(jù)類型的數(shù)值相加;二是作為字符串連接運算符,用于將兩個字符串拼接在一起。
當(dāng)你嘗試執(zhí)行null + 10這樣的表達式時,Java會嘗試找到一個合適的操作符重載來處理這個表達式。由于null不是一個數(shù)值,所以不能直接進行數(shù)學(xué)加法。但是,如果參與+操作的任一操作數(shù)是一個字符串,Java會將另一個操作數(shù)轉(zhuǎn)換為字符串,并執(zhí)行字符串連接操作。
對了,最近我整理了上百本電子書/軟件/視頻以及面試題,還在持續(xù)更新中,全部免費,文檔地址:
https://r86oxhhvu2.feishu.cn/wiki/ZMq0wjeFFiRRbvk9NeFcf7uknsJ
條件斷點應(yīng)用場景
為了定位到具體哪一條數(shù)據(jù)出了問題,我們需要按F9或點擊箭頭處按鈕直到循環(huán)到錯誤數(shù)據(jù),案例中共6條數(shù)據(jù),即使最后一條數(shù)據(jù)錯誤,我們也只需要按五次即可發(fā)現(xiàn)問題數(shù)據(jù),但是在正式/測試環(huán)境中,你無法確認從數(shù)據(jù)庫中查詢到多少條數(shù)據(jù),假如是1000條,接下來很長一段時間你將被這個問題所困擾。顯然我們應(yīng)該拒絕這種沒有效率、無意義、重復(fù)性的工作。
如何添加條件斷點
鼠標(biāo)移至紅色斷點處,使用右鍵:
在Condition中添加判斷條件,上文中出現(xiàn)的異常是NullPointerException,我們就判斷循環(huán)中的user對象age變量為null的即可:
Objects.isNull(user.getAge())
點擊Done,確認。
重啟Debug,我們可以看到循環(huán)出的第一條數(shù)據(jù)不再是列表的第一條,而是問題數(shù)據(jù):
這樣我們便可以很快的定位到錯誤數(shù)據(jù),解決問題。
條件斷點對于閱讀源碼的幫助
例如,我們在閱讀Spring Framework源碼時,條件斷點可以幫助我們快速定位到正在目標(biāo)Bean。
Spring Boot項目在啟動時,會加載所有被標(biāo)注的元數(shù)據(jù),此時我們自定義了一個Bean的類型叫a,我們可以在BeanFactoryUtils對應(yīng)的加載方法中添加條件斷點,這樣就可以更快的查看我們自定義的Bean的加載邏輯。
高階技巧-計算器
在2023新版IDEA中,可以通過以下步驟找到計算器,或者通過快捷鍵的方式找到計算器。
查看變量值
在斷點暫停時,你可以使用計算器來查看和評估變量的當(dāng)前值,這比在變量監(jiān)視窗口中查找要快得多。
修改變量值
修改變量值:如果你想要測試代碼對于不同變量值的反應(yīng),可以使用計算器改變變量的值,而無需修改代碼并重新啟動調(diào)試過程。
測試表達式
如果你在編寫代碼時不確定某個表達式的結(jié)果,可以使用計算器快速進行測試,而不必寫額外的測試代碼或者等待代碼運行到那一點。
對了,最近我整理了上百本電子書/軟件/視頻以及面試題,還在持續(xù)更新中,全部免費,文檔地址:
https://r86oxhhvu2.feishu.cn/wiki/ZMq0wjeFFiRRbvk9NeFcf7uknsJ
執(zhí)行方法調(diào)用:
通過計算器,你可以在不影響當(dāng)前程序執(zhí)行狀態(tài)的情況下執(zhí)行方法,這樣可以幫助你理解方法的行為或者驗證方法的返回值。
—END—
普通人也能直接使用ChatGPT-4/ChatGPT4o

一次性買了幾百個ChatGPT官方賬號,放在一個系統(tǒng)的池子里。共享給大家使用。不需要翻墻,就可以體驗到官方正版賬號。而且突破官方提問次數(shù)的限制。正版保證!支持GPTs、語音、聯(lián)網(wǎng)、上傳文件等功能
更多介紹點這里,無需魔法使用官方ChatGPT-4(Plus)、ChatGPT-4o!
每月只需72元!
掃碼可以加我微信購買,備注:GPT
每天只要一瓶可樂錢
