CodeGym 社區的大家好!今天我們來談談調試——它是什麼以及如何在 IntelliJ IDEA 中進行調試。本文適用於已經對 Java Core 有最低限度了解的人。不會有任何框架或複雜的過程來發布庫。悠閒漫步。所以讓自己舒服,讓我們開始吧!
文檔README 文件,所有收集花蜜的花的預期行為是收集的蜂蜜量(採用 double 形式)等於一半收集的花蜜。該項目有以下類:
文檔README 文件,花蜜以 2 比 1 的比例轉化為蜂蜜:
文檔README 文件包含錯誤,需要更新。讓我們更新 README 文件:
Stack Overflow CodeGym 上的文章 :)
為什麼需要調試模式
讓我們立即為自己澄清一些事情:沒有錯誤的代碼......這就是生活的方式。所以,如果我們的代碼沒有按預期工作,我們不應該崩潰和放棄。但是我們該怎麼辦呢?好吧,我們可以把System.out.println
語句放在各處,然後梳理控制台輸出,希望能找到錯誤。也就是說,您可以(並且人們確實)使用仔細的日誌記錄進行調試。但是如果你可以在本地機器上運行你的代碼,最好使用調試模式。我想立即說明,在本文中我們將考慮使用 IntelliJ IDEA 調試項目。
什麼是調試模式?
調試模式用於調試(檢查)正在運行的代碼。它使您可以在指定的地方停止執行並查看事情的進展情況。它可以讓您了解代碼中特定位置的程序狀態。就像能夠讓時鐘停止,從側面看一切一樣。很酷,對吧?我們的目標是快速輕鬆地學習如何使用我們鍾愛的 IntelliJ IDEA 開發環境調試應用程序。開始調試需要什麼
這裡有一些免費的建議:閱讀本文時,請執行此處描述的所有操作 — 您已完成後續需要執行的所有操作。你需要什麼:- IntelliJ IDEA 版本 2019.3.1 或更高版本。如果有人沒有這個,您可以在此處下載鏈接。下載社區版——這是我將使用的版本。
- 克隆這個 GitHub 項目並通過 IDEA 導入它。
只是一點理論......我保證:D
要開始一點點調試,您需要了解什麼是斷點並熟悉一些熱鍵。斷點是一個特殊的標記,指示您希望應用程序的執行停止的位置,可能基於應用程序狀態。您可以通過左鍵單擊左側面板或單擊代碼位置並按Ctrl+F8來設置斷點。讓我們看一下三種類型的斷點:行斷點、字段觀察點和方法斷點。這是它的樣子:-
在一條線上:
如果語句中有 lambda 表達式,那麼 IDEA 會提示你選擇是將斷點放在整個語句上還是專門放在 lambda 表達式上:
-
在一個方法上:
-
在課堂上:
- Bee.java:24 — 在第 24 行的 Bee 類中
- Main.java:14 — 在第 14 行的 Main 類中
讓我們去做這個叫做調試的事情吧!
我來自養蜂人世系,因此我創建的用於說明調試的項目描述了蜜蜂採集花蜜、將花蜜加工成蜂蜜、然後從蜂箱中提取蜂蜜的過程模型。根據可以在項目根目錄中找到的- 蜜蜂——一隻普通的工蜂
- BeeQueen——蜂王
- BeeHive——蜂箱
- HoneyPlant — 一種採集花蜜的蜜源植物(花蜜來源)
- Main — 這是我們找到的地方
public static void main()
,執行開始的方法。
main()
方法,那麼我們發現我們的程序不僅沒有計算蜂蜜的數量,而且還拋出異常…… 我們需要排查並確定問題出在哪裡。從右下角的跟踪堆棧中,我們可以看到在 RuntimeException was thrown at HoneyPlant.java:20
: That 正是我們上面所說的。讓我們通過main()
在調試模式下運行該方法來觀察此 RuntimeException。為此,請單擊方法旁邊的 IntelliJ IDEA 中的綠色三角形箭頭main()
。 結果,我們將在拋出異常之前立即停止程序,我們將看到此圖標: 要獲取所有可用信息,我們需要查看“調試”部分。它有一個變量顯示應用程序這部分可用的所有變量的窗格:
- 花蜜= 1.0;
- 花蜜容量 = -1.0。
if (nectar == 0) {
return 0;
}
但問題是我們檢查了錯誤的變量。這是代碼中的錯誤。該程序沒有檢查花中可用的花蜜量(存儲在nectarCapacity變量中),而是檢查方法的花蜜參數值,即我們要從花中提取的花蜜量。這裡是!我們的第一個錯誤!解決這個問題後,我們得到以下代碼:
if (nectarCapacity == 0) {
return 0;
}
main()
現在以正常方式 運行該方法(Run 'Main.main()')
。沒有拋出異常,程序運行: 應用程序運行完成並給出以下答案:
"33.0 honey was produced by 7 bees from 2 honey plants"
現在一切都會好起來的,但這個答案是不正確的......根據
## 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()
我們將更詳細地考慮這一點。程序在執行第 28 行之前停止執行。在下半部分,我們看到調試部分,它顯示了有關正在運行的應用程序的所有可用信息。如前所述,Variables 窗格包含應用程序這部分可用的所有變量和對象。“框架”窗格顯示應用程序正在執行的步驟——您可以查看之前的(框架)步驟並查看所有本地數據。要繼續運行程序,可以按F9或綠色圖標,如下圖: 要停止程序,單擊紅色方塊: 要以調試模式重新啟動應用程序,單擊箭頭:進一步,您可以通過使用兩個鍵逐步應用:
- F8 — 單步執行代碼而不單步執行方法;
- F7 — 單步執行代碼並單步執行方法。
beeHive.populateHoney()
方法。進入其中,我們得到: 現在我們將使用F8單步執行此方法並描述其中發生的情況:
- 第 25 行——Stream API 用於收集所有蜜蜂的花蜜
- 第 26 行——將新創建的蜂蜜添加到現有蜂蜜中;
- 第 27 行——為蜂王分配了 2 個單位的蜂蜜
- 第 28 行——從蜂蜜總量中去除這兩個單位
- 第 29 行——女王吃了這種蜂蜜。
## 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.
我們完成了。我們已經修復了我們發現的所有錯誤。我們可以洋洋得意地繼續下去,喝點咖啡,然後閱讀讓我們總結一下
在本文中,我們了解到:- 每個人的工作都有錯誤,調試是修復錯誤的好方法
- 什麼是斷點以及有哪些類型的斷點
- 如何設置異常斷點
- 如何在調試模式下單步執行代碼
GO TO FULL VERSION