一. 怎麼開啟斷點調試? 隨著開發的深入,越來越覺得高效的調試方法是多麼的重要了,但我們一般上來就是敲一些代碼,誰會去靜下心來學一些看似沒什麼用的調試技巧呢?但這恰恰就是新手和老手之間的區別。 斷點調試是很簡單的,只需要點擊idea上方的小蟲子,啟動調試即可,如下所示。 這當然不是本文的重點,只是開 ...
一. 怎麼開啟斷點調試?
隨著開發的深入,越來越覺得高效的調試方法是多麼的重要了,但我們一般上來就是敲一些代碼,誰會去靜下心來學一些看似沒什麼用的調試技巧呢?但這恰恰就是新手和老手之間的區別。
斷點調試是很簡單的,只需要點擊idea上方的小蟲子,啟動調試即可,如下所示。
這當然不是本文的重點,只是開個頭。
二. 調試界面咋那麼多按鈕?
先來介紹一下界面。
我給這些區域都標了號,下麵來重點介紹。
1.返回斷點位置
1號按鈕,這個用的不多,如果你從其他地方想要回到斷點位置,就按一下即可,如下GIF所示。
2.步過
2號按鈕,說人話就是一行行的往下執行,不會進入方法裡面,如下所示。
3.步入
3號按鈕,可以進入我們自定義的方法,如果是其他類庫的方法不會進入,如下所示。
4、5.強制步入,步出
4號5號按鈕,前者可以進入深層的方法,包括官方的源碼,後者就是從對應的方法中出來,演示如下。
6.回退斷點
6號按鈕是很特殊的,如果你的代碼中沒有調用其他地方的方法,那麼是呈灰色的,無法使用,只有進入更深層的方法,才能夠使用,其實就是後悔藥,我們很多時候調試時不小心按的快了點,很容易錯過想看的位置,只能再次重啟嗎?不,使用這個drop frame 就可以了,演示如下。
可以看到,這裡往下執行了add,但是還沒有執行完,按這個按鈕,再次回到了調用方法之前,但對於資料庫插入等操作,其實是無法回退的,這裡的回退只是因為記錄了棧信息才能夠做到的。
但是要註意,如果你某個方法調用完畢了,你想再回去那就沒有辦法了。
7.斷點跳到游標處
7號按鈕也用的不多,主要是為了快速跳轉到游標指向的那一行,如下所示。
8.表達式計算
8號按鈕是計算表達式的,我們模擬從資料庫獲取集合,用表達式查詢對應的元素,如下所示。
9.恢復程式
9號按鈕稱為 Resume Program
,能夠跳轉到指定的斷點處,我們在10行和第100行各加一個斷點,需要點幾下該按鈕跳轉到100行呢?答案是一次即可,第一次斷點會在第10行停下,點擊改按鈕直接飛越90行到第100行,如下所示。
10.停止程式
10號按鈕就是停止調試,但是註意,即便停止了調試,程式也會繼續運行下去,如何想讓他就在斷點處停止呢?後面我會說到。
11.查看所有斷點
11號按鈕打開又別有乾坤,基本功能如下圖所示,主要是設置,查看斷點信息,大家看著應吧,實用的方法我會在下麵講的。
12.禁用斷點
12號按鈕就簡單了,暫時禁用掉斷點,方便程式繼續執行,一般配合 Resume Program
。
13.其他
13號其實不是按鈕,而是一塊區域,這裡面存放了很多變數的信息,方便我們查看。
14號按鈕其實之前被我忽略掉了,這次拿出來講一下,在watch 可以監控變數的變化,有同學說,中間的變數欄也可以看啊,但是單獨拉出來,看起來更加的方便,演示如下。
三. 竟然有那麼多調試斷點?
這裡省略了普通的行斷點調試,畢竟是最簡單的,大家都會。
1.方法斷點
方法斷點是不是用在普通方法上的,最好的用法是在介面上使用,當我們在調試源碼的時候,如果在介面上打了斷點,再往下走,可以直接跳轉到實現類的實現方法上,而不需要我們一個個的去找。
案例中,有一個介面DemoInterface
,它有兩個實現類,讓我們看下效果吧,演示如下。
註意,方法斷點是一個菱形標誌。
其實可以直接在介面方法上打斷點,直接跳轉到對應的實現方法的,這裡是為了放慢演示速度。
2.屬性斷點
屬性斷點是打在屬性上的,我們無需再getter setter
方法上打斷點,在屬性上打上斷點,就會出現一個小眼睛的標誌,如下所示。
在眼睛上點擊右鍵可以設置。
我們一般是通過getter,setter方法設值的,所以就會在這兩個方法上停留。
看一下GIF演示吧。
3.異常斷點
線上上由於空指針出現了BUG,我們想快速定位到哪裡出現了空指針,應該怎麼做呢,答案就是,異常斷點!演示如下。
註意,異常斷點是一個閃電的標誌。
可以看到,我們在全局打了個空指針斷點,只要哪裡出現了空指針,就會在那裡停止,太方便了!
4.終止斷點
前面我們說過,即便停止程式,也不會讓我們後面運行的代碼取消執行,那麼我一定要取消執行可以嗎?當然是可以的,演示如,在方法棧上點擊右鍵,有一個Force Return
,然後再點擊Resumer Program
,就可以直接終止返回了。
5.條件斷點
我想要在某個條件滿足的時候打上斷點,而不想一步步的走下去,有什麼辦法嗎?當然有,在斷點處右擊,在condition
里填入相應的條件即可,演示如下。
6.流斷點
我們使用流的時候,很難看到中間做了什麼,但其實idea就幫我們解決了,我用斷點調試下麵代碼,給大家演示下。
其實只需要找到這個按鈕就行了
List<Integer> list = new ArrayList<>(Arrays.asList(1, 3, 3, 4, 4, 4, 5, 6, 78));
List<Integer> collect = list.stream()
//先將偶數篩選,再去重,返回集合
.filter(s -> s % 2 == 0)
.distinct()
.collect(Collectors.toList());
7.多線程斷點
給大家演示兩種情況,多線程下調試,定時任務下調試。
這個演示比較簡單,可能有同學不以為意,你可以去嘗試下,如果使用預設All來調試多線程程式會發生什麼,可能某條線程就跑掉了,沒有停留,而這種方式可以捕獲到運行的所有線程。
定時任務這樣調試有個好處,即便我們在調試的過程中下一個任務也到時間了,也不會執行,防止多次定時任務執行帶來的干擾,我在演示前已經提前一分鐘啟動了程式,每隔10秒鐘列印一次,但是由於暫停了線程的執行,多次點擊Resumer Program
,發現並沒有往下執行哦,而是再等了10秒鐘之後執行。
8.遠程斷點
這個忽略啦,因為確實沒有遠程打過斷點,有時間再補充吧,個人感覺可有可無。