👉 歡迎 ,你將獲得: 專屬的計畫實戰 / Java 學習路線 / 一對一提問 / 學習打卡 / 每月贈書
新計畫: 仿小紅書 (微服務架構)正在更新中... , 全棧前後端分離部落格計畫 2.0 版本完結啦, 演示連結 : http://116.62.199.48/ 。全程手摸手,後端 + 前端全棧開發,從 0 到 1 講解每個功能點開發步驟,1v1 答疑,直到計畫上線。 目前已更新了261小節,累計41w+字,講解圖:1806張,還在持續爆肝中.. 後續還會上新更多計畫,目標是將Java領域典型的計畫都整一波,如秒殺系統, 線上商城, IM即時通訊,Spring Cloud Alibaba 等等,
目錄
引言
Debug基礎
高階技巧-條件斷點
條件斷點套用場景
如何添加條件斷點
條件斷點對於閱讀源碼的幫助
高階技巧-小算盤
檢視變量值
修改變量值
測試運算式
執行方法呼叫:
目錄
引言
IntelliJ IDEA,由JetBrains(捷克共和國)開發的一款強大的Java整合式開發環境(IDE),因其豐富的功能、智慧的程式碼輔助以及使用者友好的界面設計,在全球範圍內廣受Java開發者的喜愛,在國內,筆者遇到過不使用IDEA的Java程式設計師不超過三個。不僅限於
Java
,IntelliJ IDEA還支持多種其他程式語言和框架,如
Kotlin
、
Scala
、
Groovy
以及
Android
開發等,這進一步擴大了其使用者基礎。其社群版是免費的,而專業版則提供了更為高級的功能。
Debug
(偵錯)是軟體開發中不可或缺的一個環節。它使開發者能夠逐行執行程式碼,檢查執行時的狀態,包括變量值、記憶體占用、執行緒狀態等,從而幫助開發者理解程式碼的實際行為,定位並修復錯誤。良好的偵錯工具可以顯著提高問題解決的效率,減少猜測工作,幫助開發者構建更加穩定、高效的軟體系統。
在本文中,我將向大家介紹及演示IDEA的高階
Debug
技巧,包含但不限於:
條件斷點(Conditional breakpoint): 允許開發者設定特定條件,只有當這些條件滿足時,程式才會在這些斷點處暫停執行。這對於偵錯復雜的迴圈和分支邏輯尤其有用,因為它可以讓你聚焦於特定的執行路徑或案例。
小算盤(Evaluate Expression): 這個功能允許開發者在偵錯會話中計算運算式的值,不僅可以檢視變量的當前值,還可以執行運算式,甚至呼叫方法。這對於驗證假設和測試程式碼更改而無需重新啟動整個偵錯會話非常有用。
Debug基礎
寫一段程式碼,開啟偵錯:
操作 | Windows | Mac(OS X) |
---|---|---|
進入下一步,如果當前行斷點是一個方法,則不進入當前方法體內 | F8 | F8(Fn) |
進入下一步,如果當前行斷點是一個方法,則進入當前方法體內, 如果該方法體還有方法,則不會進入該內嵌的方法中 | F7 | F7(Fn) |
智慧步入,斷點所在行上有多個方法呼叫,會彈出進入哪個方法 | Shift + F7 | ⇧F7 (Fn) |
智慧跳出 | Shift + F8 | ⇧F8 (Fn) |
恢復程式執行,如果該斷點下面程式碼還有斷點則停在下一個斷點上 | F9 | F9(Fn) |
執行到光標處,如果光標前有其他斷點會進入到該斷點 | Alt + F9 | ⌥F9(Fn) |
計算運算式(可以更改變量值使其生效) | Alt + F8 | ⌥F8 (Fn) |
切換斷點(若光標當前行有斷點則取消斷點,沒有則加上斷點) | Ctrl + F8 | ⌘F8 (Fn) |
檢視斷點資訊 | Ctrl + Shift + F8 | ⌘⇧F8 (Fn) |
高階技巧-條件斷點
我們構造一個
List<User>
用來模擬從資料庫查詢出列表,第三個元素id=3中的age內容是null,我們在for迴圈中使用加法來觸發Integer型別的拆箱來出發空指標異常。
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行程式碼內容:
為了定位問題,我們在第25行打個斷點:
null + 10
在Java中,null是一個字面量,用來表示沒有任何物件與之關聯的參照。而+操作符在Java中主要有兩種用途:一是作為數學加法運算子,用於基本數據型別的數值相加;二是作為字串連線運算子,用於將兩個字串拼接在一起。
當你嘗試執行null + 10這樣的運算式時,Java會嘗試找到一個合適的操作符多載來處理這個運算式。由於null不是一個數值,所以不能直接進行數學加法。但是,如果參與+操作的任一運算元是一個字串,Java會將另一個運算元轉換為字串,並執行字串連線操作。
條件斷點套用場景
為了定位到具體哪一條數據出了問題,我們需要按F9或點選箭頭處按鈕直到迴圈到錯誤數據,案例中共6條數據,即使最後一條數據錯誤,我們也只需要按五次即可發現問題數據,但是在正式/測試環境中,你無法確認從資料庫中查詢到多少條數據,假如是1000條,接下來很長一段時間你將被這個問題所困擾。顯然我們應該拒絕這種沒有效率、無意義、重復性的工作。
如何添加條件斷點
滑鼠移至紅色斷點處,使用右鍵:
在
Condition
中添加判斷條件,上文中出現的異常是
NullPointerException
,我們就判斷迴圈中的user物件age變量為
null
的即可:
Objects.isNull(user.getAge())
點選Done,確認。
重新開機Debug,我們可以看到迴圈出的第一條數據不再是列表的第一條,而是問題數據:
這樣我們便可以很快的定位到錯誤數據,解決問題。
條件斷點對於閱讀源碼的幫助
例如,我們在閱讀
Spring Framework
源碼時,條件斷點可以幫助我們快速定位到正在目標Bean。
Spring Boot
計畫在啟動時,會載入所有被標註的後設資料,此時我們自訂了一個Bean的型別叫a,我們可以在
BeanFactoryUtils
對應的載入方法中添加條件斷點,這樣就可以更快的檢視我們自訂的Bean的載入邏輯。
高階技巧-小算盤
在2023新版IDEA中,可以透過以下步驟找到小算盤,或者透過快捷鍵的方式找到小算盤。
檢視變量值
在斷點暫停時,你可以使用小算盤來檢視和評估變量的當前值,這比在變量監視視窗中尋找要快得多。
修改變量值
修改變量值:如果你想要測試程式碼對於不同變量值的反應,可以使用小算盤改變變量的值,而無需修改程式碼並重新啟動偵錯過程。
測試運算式
如果你在編寫程式碼時不確定某個運算式的結果,可以使用小算盤快速進行測試,而不必寫額外的測試程式碼或者等待程式碼執行到那一點。
執行方法呼叫:
透過小算盤,你可以在不影響當前程式執行狀態的情況下執行方法,這樣可以幫助你理解方法的行為或者驗證方法的返回值。
👉 歡迎 ,你將獲得: 專屬的計畫實戰 / Java 學習路線 / 一對一提問 / 學習打卡 / 每月贈書
新計畫: 仿小紅書 (微服務架構)正在更新中... , 全棧前後端分離部落格計畫 2.0 版本完結啦, 演示連結 : http://116.62.199.48/ 。全程手摸手,後端 + 前端全棧開發,從 0 到 1 講解每個功能點開發步驟,1v1 答疑,直到計畫上線。 目前已更新了261小節,累計41w+字,講解圖:1806張,還在持續爆肝中.. 後續還會上新更多計畫,目標是將Java領域典型的計畫都整一波,如秒殺系統, 線上商城, IM即時通訊,Spring Cloud Alibaba 等等,
1.
2.
3.
4.
最近面試BAT,整理一份面試資料【Java面試BATJ通關手冊】,覆蓋了Java核心技術、JVM、Java並行、SSM、微服務、資料庫、數據結構等等。
獲取方式:點「在看」,關註公眾號並回復 Java 領取,更多內容陸續奉上。
PS:因公眾號平台更改了推播規則,如果不想錯過內容,記得讀完點一下「在看」,加個「星標」,這樣每次新文章推播才會第一時間出現在你的訂閱列表裏。
點「在看」支持小哈呀,謝謝啦