你真的理解 Intellij IDEA 的 Debug 技巧嗎?這篇文章全部教給你

1. 什麼是 Debug?

還記得以前不會使用 Intellij IDEA 的 debug 功能時,想要看什麼數據都是在那行數據的下面一行加上 System.out.println(),然後運行程序,把數據打印出來,如果要看另一個數據,我就再加一行 System.out.println(),所以我的代碼就會長的像下圖這樣。。。

<code>public User getMaleUser() { List<user> userList = userDao.getUserList(); // 打印出userList,看一下userList裡面的內容長怎樣 System.out.println(userList); // 從userList中取出男生,然後回傳 User resultUser; for (User user : userList) { if (user.getGender() == "男") { resultUser = user; } } // 打印出resultUser,確認一下回傳的user到底是哪一個 System.out.println(resultUser); return resultUser;}/<user>/<code>

可想而知,這樣做的開發效率是非常差的,每多看一個數據就要多增加一行 System.out.println(),而且每次改動之後,都要重新運行程序,讓程序再打印出一次數據,我想想都覺得痛苦,難道 IDEA 就沒有一個能夠實時反應出現在這個數據的數值是什麼的功能嗎?

事實上,IDEA 是有提供的!當我們在運行代碼時,改成使用 Debug 模式 運行就可以了!

2. IDEA 的 Debug 模式

使用 IDEA 的 Debug 模式來運行代碼的好處

可以一步步排查代碼可以實時的知道代碼運行中的變量的值,甚至改變變量的值,從此不用再使用System.out.println()去打印代碼變量了

在 IDEA 的 Debug 模式中,有幾個比較重要的功能面板如下

開啟 Debug 模式的開關,通常在寫代碼時都會改用 Debug 模式來跑程序,已經很少使用旁邊的 Run 模式了設置斷點,在左邊行號欄單擊左鍵就可以設置斷點,再點一下則可以取消此斷點,能夠設置斷點是 Debug 模式和 Run 模式最大的區別,而設置斷點可以幫助我們對代碼進行一步步的排查,這也是為什麼推薦使用 Debug 模式而不是使用 Run 模式調試按鈕,Debug 調試代碼的主要功能就對應著這幾個按鈕服務按紐,和 Debug 的斷點有關係,主要搭配著 3. 調適按鈕 一起用變量區,可以查看當前斷點之前的變量

3. Debug 基本用法

IDEA 的 Debug 模式基本用法主要對應著上述的 3. 調試按鈕和 4. 服務按鈕這兩組按鈕

調試按鈕,從左到右共 8 個按鈕

Show Execution Point : 如果你的光標在其它行或其它頁面,點擊這個按鈕可跳轉到當前代碼執行的地方Step Over : 一行一行的代碼往下執行,如果這一行上有方法不會進入方法Step Into : 如果當前行有方法,可以進入方法內部,一般用於進入自定義方法內,不會進入官方類庫的方法Force Step Into : 強制進入方法內部,能進入任何方法,查看底層源碼的時候可以用這個進入官方類庫的方法Step Out : 退出方法,從進入的方法內退出到方法調用處,此時方法已執行完畢,只是還沒有完成賦值Drop Frame : 回退斷點,很少用到Run to Cursor : 運行到光標處,你可以將光標定位到你需要查看的那一行,然後使用這個功能,代碼會運行至光標行,而不需要打斷點(前提是已經進入了 Debug 模式,也就是已經停在某個斷點上了)Evaluate Expression : 計算表達式,後面第五部分詳細說明

服務按鈕,從上到下共 7 個按鈕

Rerun : 重新運行程序,他會關閉服務後重新啟動程序,不過很少用到,通常都會直接關掉再開啟一次Update 'tech' application : 更新程序,就是執行當初定義的 update 選項,當 Debug 模式啟動後,再次點擊 debug 按鈕也會跳出此選項Resume Program : 繼續執行程序,例如在第 20 行和 25 行有兩個斷點,而當前運行至第 20 行,按一下,則運行到下一個斷點(即第 25 行),再按一下,則運行完整個流程,因為後面已經沒有斷點了Pause Program : 暫停程序,很少用不是很重要Stop : 連續按兩下關閉程序,有時候你會發現關閉服務再啟動時,報端口被佔用,這是因為沒完全關閉服務的原因View Breakpoints : 查看所有斷點,後面第七部分詳細說明Mute Breakpoints : 將所有斷點變為灰色使斷點失效,按 Resume Program 那個鍵(也就是第三個按鍵)可以直接運行完程序(因為所有打的斷點都被設置為無效了),再次點擊這個 Mute Breakpoints 按鍵可以使所有無效斷點變為紅色有效

4. Debug 模式下的變量查看

在 Debug 過程中,跟蹤查看變量的變化是非常必要的,有幾個方式可以查看當前變量的值

參數所在行後面會顯示當前變量的值遊標停到參數上,會顯示當前變量信息,點擊打開可以看到變量的詳情在下方的 Variables 變量區窗口查看,這裡會顯示當前方法的所有變量,可以一次看到所有變量的詳情

5. 計算表達式 Evaluate Expression

在前面第三部分有提到一個計算表達式 Evaluation Expression 按鈕,可以使用這個按鈕在調試過程中計算某個表達式的值,或是直接改變某個變量的值,而不用再去重新改代碼手動改變量的值然後再重啟程序

假設在 Debug 模式下,想要快速比較當前 list.get(0).equals("first") 的結果,可以不用改代碼,直接在計算表達式裡面運算,讓 IDEA 快速幫助我們計算出這個函式會回傳的值,非常方便,像是下面的 3. Result 部分,得到的就是使用計算表達式運行 list.get(0).equals("first") 的結果

或是說想要更改變量的值的話,也可以透過計算表達式來改變,像是下面這個例子,正常代碼來說,list 裡只會有 first、second 兩個字串,但是因為我們在計算表達式裡調用了 list.add("third") 向 list 裡插了一條新的字串,所以下方 Variables 變量區才會顯示 list 裡面有三個字串 first、second、third

題外話說一下,如果只是單純想要改變變量的值的話,還有另一種方法,不用透過計算表達式那麼麻煩。只要在 Variables 變量區直接在變量上點右鍵,使用 setValue 也能重新改變此變量的值的

6. 斷點條件設置

有的時候在遍歷一個集合或是數組的時候,可能只想要看 for 迴圈面的某個 i 值超過多少以上的變量情況,這時候就可以透過設置斷點條件來達成,也就是說,只有在滿足了斷點條件時,才會停在斷點處,不然就會直接忽略此斷點

對斷點點擊右鍵可以設置斷點條件,像是下圖是設置成在 i=3 時才停下(如果沒有設置斷點條件的話,則每進一次for loop,每個 i 都會停一次斷點)

7. 查看所有斷點

在左下方點擊 View Breakpoints 可以查看目前已經設置的所有斷點,有時候自己斷點打多了很容易忘記打在哪,可以透過這個功能知道自己都在哪些地方打了斷點,取消勾選可以使此斷點失效

8. 設置異常斷點

當設置異常斷點,在程序中出現需要攔截的異常時,會自動定位到異常行

設置方式一樣是先點擊 view breakpoints,之後點擊 + 號添加異常斷點,這邊添加了 NullPointerException

當出現空指針異常時,會自動跳到拋出空指針異常的行數,省的我們再去定位問題點在哪,非常方便

9. 總結

本文列出了 Intellij IDEA 中 Debug 模式的實用用法,讓你在開發路上更順暢

不過要注意一點,因為 debug 時會讓整個程式停在你打的斷點上,所以千萬不能夠在正式環境下 debug,只能夠在測試環境進行 debug