สวัสดีทุกคนในชุมชน CodeGym! วันนี้เรามาพูดถึงการดีบักกัน — มันคืออะไรและจะดีบักใน IntelliJ IDEA ได้อย่างไร บทความนี้มีไว้สำหรับผู้ที่มีความรู้ขั้นต่ำของ Java Core แล้ว จะไม่มีเฟรมเวิร์กหรือขั้นตอนที่ซับซ้อนในการเผยแพร่ไลบรารี่ เดินเล่นสบายๆ ทำตัวให้สบายแล้วเริ่มกันเลย!
เลือก โครงการนำเสนอการ แก้ไขจุดบกพร่องและกดตกลง จากนั้นคุณ จะเห็นหน้าต่างต่อไปนี้:
ปล่อยตัวเลือกที่เลือกไว้: นำเข้าโครงการจากแหล่งภายนอกและMaven คลิกเสร็จสิ้น ตอนนี้เราได้นำเข้าโครงการแล้ว เราสามารถอธิบายกระบวนการที่เหลือด้วยตัวอย่างที่มีชีวิตได้
ไอคอนในส่วนการตรวจแก้จุดบกพร่อง การดำเนินการนี้จะปิดเสียงเบรกพอยต์ทั้งหมด หากต้องการดูว่าเบรกพอยต์ใดที่ตั้งค่าไว้ คุณสามารถไปที่ส่วนดีบักที่มุมล่างซ้ายและค้นหาไอคอน หรือ
กดCtrl+Shift+F8 :
เมื่อย้ายไปยังรายการเบรกพอยต์ เราจะเห็นสิ่งต่อไปนี้:
เบรกพอยต์มีอยู่สองรายการ ที่นี่:
ในหน้าต่างที่ปรากฏขึ้น ให้เขียนชื่อข้อยกเว้นที่คุณต้องการเพิ่ม เลือกจากรายการและคลิกOK :
สรุปเบื้องต้นของเราเกี่ยวกับวิธีการตั้งค่า ดังนั้นตอนนี้เรา' จะไปฝึกบ้าง
เอกสารไฟล์ README ซึ่งสามารถพบได้ในไดเร็กทอรีรากของโครงการ พฤติกรรมที่คาดหวังของดอกไม้ทั้งหมดที่เก็บน้ำหวานคือปริมาณน้ำผึ้งที่เก็บได้ (ซึ่งอยู่ในรูปของสองเท่า)เท่ากับครึ่งหนึ่งของ น้ำหวานที่รวบรวมได้ โครงการมีชั้นเรียนดังต่อไปนี้:
เราจำเป็นต้องตรวจสอบและระบุว่าปัญหาคืออะไร จากสแต็กการติดตามที่มุมขวาล่าง เราจะเห็นว่าใน RuntimeException ถูกโยนไปที่
นั่นเป็นเพียงสิ่งที่เราพูดถึงด้านบน ลองดู RuntimeException นี้โดยเรียกใช้
ผลที่ตามมาคือ เราจะให้โปรแกรมหยุดทำงานทันทีก่อนที่ข้อยกเว้นจะเกิดขึ้น และเราจะเห็นไอคอนนี้: ![การดีบักใน IntelliJ IDEA: คู่มือสำหรับผู้เริ่มต้น - 17]()
เพื่อให้ได้ข้อมูลทั้งหมดที่มีอยู่ เราต้องดูในส่วนการดีบัก มันมีตัวแปรบานหน้าต่างที่แสดงตัวแปรทั้งหมดที่มีในส่วนนี้ของแอปพลิเคชัน:
แอปพลิเคชันทำงานจนเสร็จสิ้นและให้คำตอบต่อไปนี้:
เอกสารประกอบไฟล์ README น้ำหวานจะถูกแปลงเป็นน้ำผึ้งในอัตราส่วน 2 ต่อ 1:
เราจะพิจารณาประเด็นนี้โดยละเอียดยิ่งขึ้น โปรแกรมหยุดทำงานก่อนที่จะดำเนินการบรรทัดที่ 28 ในส่วนล่าง เราจะเห็นส่วนการตรวจแก้จุดบกพร่อง ซึ่งแสดงข้อมูลที่มีอยู่ทั้งหมดเกี่ยวกับแอปพลิเคชันที่กำลังทำงานอยู่ ดังที่กล่าวไว้แล้ว บานหน้าต่างตัวแปรประกอบด้วยตัวแปรและวัตถุทั้งหมดที่มีจากส่วนนี้ของแอปพลิเคชัน บานหน้าต่างเฟรมแสดงขั้นตอนที่แอปพลิเคชันดำเนินการ — คุณสามารถดูขั้นตอนก่อนหน้า (เฟรม) และดูข้อมูลในเครื่องทั้งหมดได้ ในการรันโปรแกรมต่อ คุณสามารถกดF9หรือไอคอนสีเขียวตามที่แสดงด้านล่าง:
หากต้องการหยุดโปรแกรม ให้คลิกที่สี่เหลี่ยมสีแดง:
หากต้องการรีสตาร์ทแอปพลิเคชันในโหมดดีบัก ให้คลิกที่ลูกศร:
นอกจากนี้ คุณสามารถดำเนินการต่อผ่าน แอปพลิเคชันทีละขั้นตอนโดยใช้สองปุ่ม:
ตอนนี้เราจะใช้F8เพื่อทำตามขั้นตอนนี้และอธิบายสิ่งที่เกิดขึ้น:
เอกสาร README มีข้อผิดพลาดและจำเป็นต้องอัปเดต มาอัพเดทไฟล์ README:
Stack Overflow CodeGym ได้อย่างใจเย็น :)

ทำไมคุณต้องใช้โหมด Debug
เรามาชี้แจงบางอย่างในทันที: ไม่มีรหัสใดที่ไม่มีข้อบกพร่อง... นี่เป็นเพียงวิธีการทำงานของชีวิต ดังนั้น เราไม่ควรแตกเป็นชิ้นเล็กชิ้นน้อยและยอมแพ้หากโค้ดของเราไม่ทำงานตามที่เราคาดไว้ แต่เราควรทำอย่างไร? เราสามารถใส่System.out.println
คำสั่งทุกที่แล้วหวีผ่านคอนโซลเอาต์พุตโดยหวังว่าจะพบข้อผิดพลาด ที่กล่าวว่า คุณสามารถ (และคนอื่นทำ) ดีบักได้โดยใช้การบันทึกอย่างระมัดระวัง แต่ถ้าคุณสามารถรันโค้ดบนเครื่องโลคัลได้ ควรใช้โหมดดีบั๊ก จะดีกว่า ฉันต้องการทราบทันทีว่าในบทความนี้เราจะพิจารณาการดีบักโครงการโดยใช้ IntelliJ IDEA
โหมดดีบั๊กคืออะไร?
โหมดดีบั๊กมีไว้สำหรับดีบั๊ก (ตรวจสอบ) รันโค้ด ทำให้คุณสามารถหยุดการดำเนินการในสถานที่ที่กำหนดและดูว่าสิ่งต่างๆ ดำเนินไปอย่างไร ช่วยให้คุณเข้าใจสถานะของโปรแกรม ณ ตำแหน่งเฉพาะในโค้ด มันเหมือนกับสามารถหยุดนาฬิกาและมองทุกสิ่งจากด้านข้าง เย็นใช่มั้ย? วัตถุประสงค์ของเราคือการเรียนรู้วิธีการดีบักแอปพลิเคชันอย่างรวดเร็วและง่ายดายโดยใช้สภาพแวดล้อมการพัฒนา IntelliJ IDEA อันเป็นที่รักของเราสิ่งที่คุณต้องการเพื่อเริ่มการดีบัก
ต่อไปนี้เป็นคำแนะนำฟรี: ขณะที่อ่านบทความนี้ ให้ทำทุกอย่างที่จะอธิบายไว้ที่นี่ คุณมีทุกสิ่งที่ต้องทำตาม สิ่งที่คุณต้องการ:- IntelliJ IDEA เวอร์ชัน 2019.3.1 หรือสูงกว่า ในกรณีที่ใครไม่มี นี่คือลิงค์ที่คุณสามารถดาวน์โหลดได้ ดาวน์โหลด Community Edition — นั่นคือเวอร์ชันที่ฉันจะใช้
- คัดลอกโครงการ GitHub นี้และนำเข้าผ่าน IDEA


แค่ทฤษฏีนิดหน่อย...ผมสัญญา :D
ในการเริ่มแก้ไขข้อบกพร่องแม้แต่นิดเดียว คุณต้องเข้าใจว่าเบรกพอยต์คืออะไรและทำความคุ้นเคยกับปุ่มลัดบางปุ่ม เบรกพอยต์เป็นเครื่องหมายพิเศษที่ระบุตำแหน่งที่คุณต้องการหยุดการทำงานของแอปพลิเคชัน ซึ่งอาจขึ้นอยู่กับสถานะของแอปพลิเคชัน คุณสามารถตั้งค่าเบรกพอยต์ได้โดยคลิกซ้ายที่แผง ด้านซ้าย หรือคลิกตำแหน่งโค้ดแล้วกดCtrl+F8 มาดูเบรกพอยต์สามประเภท: เบรกพอยต์ของเส้น เบรกพอยต์ของฟิลด์ และเบรกพอยต์ของเมธอด นี่คือลักษณะ:-
ในบรรทัด:
หากคำสั่งมีนิพจน์แลมบ์ดา IDEA จะแจ้งให้คุณเลือกว่าจะใส่เบรกพอยต์ในคำสั่งทั้งหมดหรือเฉพาะในนิพจน์แลมบ์ดา:
-
ในวิธีการ:
-
ในชั้นเรียน:




- Bee.java:24 — ในคลาส Bee ที่บรรทัด 24
- Main.java:14 — ในคลาสหลักในบรรทัดที่ 14


มาทำสิ่งนี้ที่เรียกว่าการแก้จุดบกพร่องกันเถอะ!
ฉันมาจากตระกูลผู้เลี้ยงผึ้งหลายครอบครัว ดังนั้นโปรเจ็กต์ที่ฉันสร้างขึ้นเพื่อแสดงให้เห็นการแก้ไขจุดบกพร่องจึงอธิบายถึงแบบจำลองกระบวนการของผึ้งในการเก็บน้ำหวาน แปรรูปน้ำหวานเป็นน้ำผึ้ง แล้วจึงรับน้ำผึ้งจากรังผึ้ง ตาม- ผึ้ง — ผึ้งงานธรรมดา
- BeeQueen — ราชินีผึ้ง
- BeeHive — รังผึ้ง
- HoneyPlant — พืชน้ำผึ้ง (แหล่งน้ำหวาน) ที่เก็บน้ำหวาน
- หลัก — นี่คือที่ที่เราพบ
public static void main()
วิธีการเริ่มต้นการดำเนินการ
main()
เมธอด เราพบว่าไม่เพียงแต่โปรแกรมของเราไม่คำนวณปริมาณน้ำผึ้งเท่านั้น แต่ยังมีข้อยกเว้น... 
HoneyPlant.java:20
: 
main()
เมธอดในโหมดดีบัก ในการทำเช่นนี้ ให้คลิกที่ลูกศรสามเหลี่ยมสีเขียวใน IntelliJ IDEA ถัดจากmain()
วิธีการ 


- น้ำทิพย์ = 1.0;
- น้ำหวานความจุ = -1.0.
if (nectar == 0) {
return 0;
}
แต่ปัญหาคือเรากำลังตรวจสอบตัวแปรผิด นี่เป็นข้อผิดพลาดในรหัส แทนที่จะตรวจสอบปริมาณน้ำหวานที่มีอยู่ในดอกไม้ (ซึ่งเก็บอยู่ในตัวแปรDTACCapacity ) โปรแกรมจะตรวจสอบค่าของ พารามิเตอร์ น้ำหวาน ของเมธอด ซึ่งเป็นปริมาณน้ำหวานที่เราต้องการนำมาจากดอกไม้ นี่คือ! บั๊กแรกของเรา! หลังจากแก้ไขแล้ว เราจะได้รับรหัสต่อไปนี้:
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()
ในโหมดดีบัก: 



- F8 — ก้าวผ่านโค้ดโดยไม่ต้องเข้าสู่เมธอด
- F7 — ก้าวผ่านโค้ดและเข้าสู่เมธอด
beeHive.populateHoney()
วิธีการ เราได้รับ: 
- บรรทัดที่ 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