CodeGym 社區的大家好!今天我們來談談調試——它是什麼以及如何在 IntelliJ IDEA 中進行調試。本文適用於已經對 Java Core 有最低限度了解的人。不會有任何框架或複雜的過程來發布庫。悠閒漫步。所以讓自己舒服,讓我們開始吧! 在 IntelliJ IDEA 中調試:初學者指南 - 1

為什麼需要調試模式

讓我們立即為自己澄清一些事情:沒有錯誤的代碼......這就是生活的方式。所以,如果我們的代碼沒有按預期工作,我們不應該崩潰和放棄。但是我們該怎麼辦呢?好吧,我們可以把System.out.println語句放在各處,然後梳理控制台輸出,希望能找到錯誤。也就是說,您可以(並且人們確實)使用仔細的日誌記錄進行調試。但是如果你可以在本地機器上運行你的代碼,最好使用調試模式。我想立即說明,在本文中我們將考慮使用 IntelliJ IDEA 調試項目。

什麼是調試模式?

調試模式用於調試(檢查)正在運行的代碼。它使您可以在指定的地方停止執行並查看事情的進展情況。它可以讓您了解代碼中特定位置的程序狀態。就像能夠讓時鐘停止,從側面看一切一樣。很酷,對吧?我們的目標是快速輕鬆地學習如何使用我們鍾愛的 IntelliJ IDEA 開發環境調試應用程序。

開始調試需要什麼

這裡有一些免費的建議:閱讀本文時,請執行此處描述的所有操作 — 您已完成後續需要執行的所有操作。你需要什麼:
  1. IntelliJ IDEA 版本 2019.3.1 或更高版本。如果有人沒有這個,您可以在此處下載鏈接。下載社區版——這是我將使用的版本。
  2. 克隆這個 GitHub 項目並通過 IDEA 導入它。
打開 IDEA: 在 IntelliJ IDEA 中調試:初學者指南 - 2選擇debug-presentation項目並按OK。然後您將看到以下窗口: 在 IntelliJ IDEA 中調試:初學者指南 - 3保留所選選項:從外部源Maven導入項目。單擊完成。現在我們已經導入了項目,我們可以用一個活生生的例子來描述剩下的過程。

只是一點理論......我保證:D

要開始一點點調試,您需要了解什麼是斷點並熟悉一些熱鍵。斷點是一個特殊的標記,指示您希望應用程序的執行停止位置,可能基於應用程序狀態。您可以通過左鍵單擊左側面板或單擊代碼位置並按Ctrl+F8來設置斷點。讓我們看一下三種類型的斷點:行斷點、字段觀察點和方法斷點。這是它的樣子:
  • 在一條線上:

    在 IntelliJ IDEA 中調試:初學者指南 - 4

    如果語句中有 lambda 表達式,那麼 IDEA 會提示你選擇是將斷點放在整個語句上還是專門放在 lambda 表達式上:

    在 IntelliJ IDEA 中調試:初學者指南 - 5
  • 在一個方法上:

    在 IntelliJ IDEA 中調試:初學者指南 - 6
  • 在課堂上:

    在 IntelliJ IDEA 中調試:初學者指南 - 7
可以按照用於添加斷點的相同步驟刪除斷點。有些情況下您會想要停用(靜音)它們。為此,請 在 IntelliJ IDEA 中調試:初學者指南 - 8在“調試”部分找到該圖標。這將使所有斷點靜音。要查看已設置的斷點,您可以轉到左下角的調試部分並找到圖標 在 IntelliJ IDEA 中調試:初學者指南 - 9,或者按Ctrl+Shift+F8在 IntelliJ IDEA 中調試:初學者指南 - 10移動到斷點列表,我們將看到以下內容: 在 IntelliJ IDEA 中調試:初學者指南 - 11有兩個斷點這裡:
  • Bee.java:24 — 在第 24 行的 Bee 類中
  • Main.java:14 — 在第 14 行的 Main 類中
請注意,如果您克隆了項目,這些斷點將不會自動設置:您需要自己設置它們!還有一個Java 異常斷點部分。這非常有用。在這裡您可以添加一個隱式斷點,以便程序在拋出任何異常或特定異常之前停止。我們將為 RuntimeException 添加一個隱式斷點。這很容易做到。找到左上角的“+”圖標。單擊它並選擇Java Exception Breakpoints在 IntelliJ IDEA 中調試:初學者指南 - 12在出現的窗口中,寫下您要添加的異常的名稱,從列表中選擇並單擊 OK 關於 在 IntelliJ IDEA 中調試:初學者指南 - 13如何設置的入門知識到此結束,現在我們我會繼續練習。

讓我們去做這個叫做調試的事情吧!

我來自養蜂人世系,因此我創建的用於說明調試的項目描述了蜜蜂採集花蜜、將花蜜加工成蜂蜜、然後從蜂箱中提取蜂蜜的過程模型。根據可以在項目根目錄中找到的文檔README 文件,所有收集花蜜的花的預期行為是收集的蜂蜜量(採用 double 形式等於一半收集的花蜜。該項目有以下類:
  • 蜜蜂——一隻普通的工蜂
  • BeeQueen——蜂王
  • BeeHive——蜂箱
  • HoneyPlant — 一種採集花蜜的蜜源植物(花蜜來源)
  • Main — 這是我們找到的地方public static void main(),執行開始的方法。
如果我們運行該main()方法,那麼我們發現我們的程序不僅沒有計算蜂蜜的數量,而且還拋出異常…… 在 IntelliJ IDEA 中調試:初學者指南 - 14我們需要排查並確定問題出在哪裡。從右下角的跟踪堆棧中,我們可以看到在 RuntimeException was thrown at HoneyPlant.java:20: 在 IntelliJ IDEA 中調試:初學者指南 - 15That 正是我們上面所說的。讓我們通過main()在調試模式下運行該方法來觀察此 RuntimeException。為此,請單擊方法旁邊的 IntelliJ IDEA 中的綠色三角形箭頭main()在 IntelliJ IDEA 中調試:初學者指南 - 16結果,我們將在拋出異常之前立即停止程序,我們將看到此圖標: 在 IntelliJ IDEA 中調試:初學者指南 - 17在 IntelliJ IDEA 中調試:初學者指南 - 18要獲取所有可用信息,我們需要查看“調試”部分。它有一個變量顯示應用程序這部分可用的所有變量的窗格:
  • 花蜜= 1.0;
  • 花蜜容量 = -1.0。
拋出異常是有道理的,因為蜂蜜植物不能有負量的花蜜。但是為什麼會這樣呢?畢竟,在第 15-17 行,我們檢查 nectar 供應是否耗盡,如果是則返回零:

	if (nectar == 0) {
   	     return 0;
}
但問題是我們檢查了錯誤的變量。這是代碼中的錯誤。該程序沒有檢查花中可用的花蜜量(存儲在nectarCapacity變量中),而是檢查方法的花蜜參數值,即我們要從花中提取的花蜜量。這裡是!我們的第一個錯誤!解決這個問題後,我們得到以下代碼:

	if (nectarCapacity == 0) {
   	     return 0;
}
main()現在以正常方式 運行該方法(Run 'Main.main()')。沒有拋出異常,程序運行: 在 IntelliJ IDEA 中調試:初學者指南 - 19應用程序運行完成並給出以下答案:

"33.0 honey was produced by 7 bees from 2 honey plants"
現在一切都會好起來的,但這個答案是不正確的......根據文檔README 文件,花蜜以 2 比 1 的比例轉化為蜂蜜:

## Documentation
Presentation based on honey production.

**Note**: 2 units of nectar = 1 unit of honey
主要方法顯然有兩種蜂蜜植物,分別有 30 單位和 40 單位的花蜜。所以我們最終應該得到 35 個單位的蜂蜜。但是程序告訴我們,我們得到了 33。其他兩個單位去哪兒了?讓我們找出答案!為此,請在Main.main()第 28 行的方法中設置一個斷點,在調試模式下 beeHive.populateHoney()調用並運行該方法:main()在 IntelliJ IDEA 中調試:初學者指南 - 20我們將更詳細地考慮這一點。程序在執行第 28 行之前停止執行。在下半部分,我們看到調試部分,它顯示了有關正在運行的應用程序的所有可用信息。如前所述,Variables 窗格包含應用程序這部分可用的所有變量和對象。“框架”窗格顯示應用程序正在執行的步驟——您可以查看之前的(框架)步驟並查看所有本地數據。要繼續運行程序,可以按F9或綠色圖標,如下圖: 在 IntelliJ IDEA 中調試:初學者指南 - 21要停止程序,單擊紅色方塊: 在 IntelliJ IDEA 中調試:初學者指南 - 22要以調試模式重新啟動應用程序,單擊箭頭:在 IntelliJ IDEA 中調試:初學者指南 - 23進一步,您可以通過使用兩個鍵逐步應用:
  • F8 — 單步執行代碼而不單步執行方法;
  • F7 — 單步執行代碼並單步執行方法。
在我們的例子中,我們需要按 F7 進入beeHive.populateHoney()方法。進入其中,我們得到: 在 IntelliJ IDEA 中調試:初學者指南 - 24現在我們將使用F8單步執行此方法並描述其中發生的情況:
  • 第 25 行——Stream API 用於收集所有蜜蜂的花蜜
  • 第 26 行——將新創建的蜂蜜添加到現有蜂蜜中;
  • 第 27 行——為蜂王分配了 2 個單位的蜂蜜
  • 第 28 行——從蜂蜜總量中去除這兩個單位
  • 第 29 行——女王吃了這種蜂蜜。
這就是兩個失踪單位的去處!歡呼!在與業務分析師交談後,我們得出結論,文檔README 文件包含錯誤,需要更新。讓我們更新 README 文件:

## Documentation
Presentation based on honey production.

**Note**:
* 2 units of nectar = 1 unit of honey
* The queen bee eats 2 units of honey every time when beehive is replenished with honey.
我們完成了。我們已經修復了我們發現的所有錯誤。我們可以洋洋得意地繼續下去,喝點咖啡,然後閱讀Stack Overflow CodeGym 上的文章 :)

讓我們總結一下

在本文中,我們了解到:
  • 每個人的工作都有錯誤,調試是修復錯誤的好方法
  • 什麼是斷點以及有哪些類型的斷點
  • 如何設置異常斷點
  • 如何在調試模式下單步執行代碼

閱讀文章