ฉันสามารถหาค่าส่งคืนก่อนที่จะส่งคืนในขณะที่ดีบักใน Eclipse ได้หรือไม่


99

เป็นไปได้ไหมที่จะเห็นค่าส่งคืนของเมธอดหลังจากรันบรรทัดแล้วและก่อนที่ตัวชี้คำสั่งจะกลับไปที่ฟังก์ชันการโทร

ฉันกำลังดีบักโค้ดฉันไม่สามารถแก้ไขได้(อ่าน: ไม่ต้องการรวบรวมไลบรารีของบุคคลที่สามอีกครั้ง)และบางครั้งมันก็ข้ามไปยังโค้ดที่ฉันไม่มีซอร์สหรือนิพจน์ที่ส่งคืนมีผลข้างเคียงที่ทำให้ฉันไม่เป็น สามารถเรียกใช้นิพจน์ในแท็บDisplay

บ่อยครั้งที่ค่าส่งคืนถูกใช้ในคำสั่งผสมดังนั้นมุมมองตัวแปรจะไม่แสดงค่าให้ฉันเห็น (ดังนั้นจึงต้องการดูผลลัพธ์ก่อนที่การควบคุมจะกลับไปที่ฟังก์ชันการเรียก)

อัปเดต:ฉันไม่สามารถใช้โปรแกรมดูนิพจน์ได้เนื่องจากมีผลข้างเคียงในคำสั่ง


7
นั่นเป็นเหตุผลที่ฉันเปลี่ยนไปใช้ IntelliJ เวอร์ชันชุมชน - คนใน Eclipse ดูเหมือนจะไม่เข้าใจว่าสิ่งนี้สำคัญแค่ไหน (ถ้าพวกเขาแก้ไขได้ฉันจะเปลี่ยนกลับวันที่เผยแพร่)

@James Mitchell สิ่งนี้ดูเหมือนจะเป็นความคิดที่ดีสำหรับปลั๊กอิน ฉันจะเพิ่มลงในรายการสิ่งที่ต้องทำและจะพยายามทำเมื่อพบเวลา (ไม่ใช่เร็ว ๆ นี้)
IAdapter

@ user672348 แต่จะทำใน IntelliJ IDEA ได้อย่างไร?
Alexey Tigarev

@AlexeyTigarev: IIRC จะปรากฏขึ้นเมื่อคุณทำ "Step Return" (หรือเทียบเท่า)
Blaisorblade

1
เตรียมตัวให้พร้อมสำหรับ Eclipse Oxygen (วันที่วางจำหน่ายกลางปี ​​2017) ความสำเร็จของ M2 มีคุณลักษณะนี้
อับดุล

คำตอบ:


36

คุณลักษณะนี้ถูกบันทึกอยู่ใน Eclipse เวอร์ชั่น 4.7 M2 ภายใต้คราสข้อผิดพลาด 40912

วิธีใช้:

  • ก้าวข้ามreturnคำสั่ง (โดยใช้ "Step Over" หรือ "Step Return")
  • ตอนนี้บรรทัดแรกในมุมมองตัวแปรจะแสดงผลลัพธ์ของคำสั่ง return ดังที่ "[statement xxx] ส่งคืน:"

ดูEclipse Project Oxygen (4.7) M2 - ใหม่และน่าสังเกตสำหรับรายละเอียด


ฉันด้วย. ฉันพลาดฟีเจอร์นี้เมื่อใช้ Eclipse
m24p

1
ข้อผิดพลาดนี้เกิดคราสต่อมาเปิดในปลายปี 2009 ยังคงรอการแก้ไขโดยไม่มีใครมอบหมายและไม่มีเป้าหมายหลัก :)
Mark A. Fitzgerald

1
สิ่งนี้ได้รับการแก้ไขแล้วในรุ่นล่าสุดของ Eclipse 4.7 (M2 เป็นต้นไป)
AbdullahC

1
ข้อมูลบางส่วนสำหรับวิธีใช้โปรแกรมฟิกซ์สามารถพบได้ใน New And Noteworthy สำหรับ 4.7 M2 ค้นหา "ผลลัพธ์ของวิธีการหลังจากการดำเนินการขั้นตอน" ที่นี่: eclipse.org/eclipse/news/4.7/M2
Joshua Goldberg

@JoshuaGoldberg: ขอบคุณที่ชี้ให้เห็น - ฉันแก้ไขเป็นคำตอบ
sleske

34

พบทางลัดที่ดีจริงๆสำหรับสิ่งนี้ เลือกนิพจน์ที่ส่งคืนค่าแล้วกด

Ctrl + Shift + D

สิ่งนี้จะแสดงค่าของคำสั่ง return สิ่งนี้มีประโยชน์มากในกรณีที่คุณไม่สามารถหรือไม่ต้องการเปลี่ยนแปลงเพียงเพื่อจุดประสงค์ในการดีบัก

หวังว่านี่จะช่วยได้

หมายเหตุ: ยังไม่ได้ทดสอบสิ่งนี้กับไลบรารีของบุคคลที่สาม แต่ใช้งานได้ดีสำหรับรหัสของฉัน ทดสอบสิ่งนี้บนEclipse Java EE IDE สำหรับ Web Developers เวอร์ชัน: Juno Service Release 1


4
+1 เนื่องจากสิ่งนี้ไม่เพียง แต่ใช้ได้กับค่าที่ส่งคืนเท่านั้น แต่สำหรับนิพจน์โดยทั่วไป สะดวกกว่าการใช้แท็บนิพจน์มาก ควรสังเกตว่าสิ่งนี้เรียกใช้โค้ดดังนั้นหากมีผลข้างเคียงโปรดระวัง help.eclipse.org/indigo/…
แพะ

1
Ctrl + Shift + Iยังเป็นประโยชน์สำหรับฉัน
Ciro Santilli 郝海东冠状病六四事件法轮功

2
ตามที่ @goat กล่าวไว้สิ่งนี้จะรันโค้ดหลายครั้งตัวอย่างเช่นหากฟังก์ชันทำสิ่งนี้return System.currentTimeMillis();คุณจะได้ผลลัพธ์ที่แตกต่างจากที่ฟังก์ชันส่งคืนจริง
Brad Parks

เทียบเท่ากับApple machine?
Adrien Be

นี่เป็นคำแนะนำที่เป็นปัญหาซึ่งจะประเมินการแสดงออกอีกครั้งซึ่งอาจเป็นหายนะได้หากมีผลข้างเคียง
sleske


5

นั่นเป็นเหตุผลที่ฉันยึดติดกับรูปแบบต่อไปนี้สำหรับวิธีการ:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

กฎของฉัน:

  1. คำสั่งส่งคืนเพียงคำสั่งเดียวเมื่อสิ้นสุดวิธีการเท่านั้น (สุดท้ายได้รับอนุญาตหลังจากนั้น)
  2. มักจะมีผลลัพธ์ที่เรียกว่าโลคัลซึ่งเก็บค่าที่ส่งคืนโดยเริ่มจากค่าเริ่มต้น

โดยธรรมชาติแล้วผู้ที่ได้รับการยกเว้นส่วนใหญ่จะได้รับการยกเว้น


3
เฮ้ zvikico - เมื่อฉันทำงานกับโค้ดของตัวเองฉันมักจะใช้รูปแบบที่คล้ายกัน น่าเสียดายที่ปัญหาของฉันคือเมื่อฉันใช้รหัสที่ฉันไม่ได้เขียนหรือแก้ไขได้ : S
RodeoClown

ฉันก็ทำแบบนี้เหมือนกัน แต่ SonarLint ก็บ่น .... ตอนนี้ฉันกำลังเทียบเคียงอยู่: stackoverflow.com/questions/31733811/…
HDave

@WitoldKaczurba นั่นคือความคิดเห็นของคุณและไม่เป็นไร เพียงแค่ยอมรับว่ามีความคิดเห็นอื่น ๆ และแสดงความเคารพต่อผู้ที่ทำ
zvikico

สวัสดี zvikco ขอบคุณสำหรับข้อความ ผมยอมรับว่ามีวิธีการที่แตกต่างกัน แต่ฉันเรียกpmd.sourceforge.io/pmd-4.3.0/rules/... ไชโย
Witold Kaczurba

2

ฉันอยากรู้เกี่ยวกับคำตอบสำหรับคำถามนี้ด้วย

ในอดีตเมื่อจัดการกับไลบรารีของบุคคลที่สามเช่นนั้นสิ่งที่ฉันทำคือสร้างคลาส wrapper หรือคลาสย่อยที่มอบสิทธิ์ให้กับคลาสพาเรนต์และทำการดีบักในคลาส wrapper / child แม้ว่าจะต้องใช้เวลาเพิ่ม


1
ปัญหาในการแก้ปัญหานี้ (นอกเหนือจากที่คุณระบุไว้เกี่ยวกับงานพิเศษ) คือจะใช้งานได้ก็ต่อเมื่อคุณไม่มีคลาส / วิธีการหลายอย่างที่อยู่ลึกเข้าไปในไลบรารีภายนอก แต่จะมีประโยชน์เมื่อคุณจัดการกับชั้นนอกของวิธีการ
RodeoClown


0

ยากหนึ่ง ประสบการณ์ของผมด้านนอกของคราสคือว่าถ้าคุณอาจต้องดูค่าตอบแทนที่ดีที่สุดคือการกำหนดให้ตัวแปรท้องถิ่นในการทำงานเพื่อให้คำสั่งกลับเป็นที่เรียบง่ายและไม่return varname; return(some * expression || other);อย่างไรก็ตามนั่นไม่เป็นประโยชน์กับคุณอย่างมากเนื่องจากคุณบอกว่าคุณไม่สามารถ (หรือไม่ต้องการ) แก้ไขหรือคอมไพล์โค้ดใหม่ได้ ดังนั้นฉันไม่มีคำตอบที่ดีสำหรับคุณบางทีคุณอาจต้องพิจารณาความต้องการของคุณใหม่


ในโค้ดของฉันฉันมักจะมีขั้นตอนกลางเพื่อที่ฉันจะได้ตรวจสอบผลลัพธ์ แต่โค้ดบางส่วนที่ฉันใช้มีค่าใช้จ่ายขององค์กรมากเกินไปที่จะแก้ไข (โดยเฉพาะอย่างยิ่งถ้าไลบรารีได้รับการอัปเดตไม่ต้องการรักษาเวอร์ชันที่แยก สำหรับการดีบักเท่านั้น)
RodeoClown

0

ขึ้นอยู่กับคำสั่ง return คุณสามารถไฮไลต์นิพจน์ที่ถูกส่งกลับและจากเมนูคลิกขวาควรมีบางอย่างเช่น "evaluation expression" (ตอนนี้ฉันไม่มี eclipse อยู่ข้างหน้าฉัน แต่มันเป็นแบบนั้น ). มันจะแสดงให้คุณเห็นสิ่งที่จะถูกส่งกลับ


4
ปัญหาคือเมื่อการประเมินคุณสมบัติการส่งคืนมีผลข้างเคียง (เช่นรายการฐานข้อมูลที่สร้างเป็นต้น) การประเมินนิพจน์การส่งคืนจะเปลี่ยนสถานะของระบบ ขอบคุณสำหรับคำแนะนำ
RodeoClown

0

นี่เป็นเรื่องที่ไกลตัว แต่ดูเหมือนจะไม่มีวิธีง่ายๆ:

คุณสามารถใช้ AspectJ เพื่อสร้าง JAR โดยมีแง่มุมที่รับค่าส่งคืนของวิธีการที่คุณสนใจตามเอกสารของ Eclipse โปรแกรม AspectJ สามารถดีบักได้เหมือนกับโปรแกรมอื่น ๆ

มีสองตัวเลือกในการสานชั้นเรียนของคุณโดยไม่ต้องคอมไพล์ห้องสมุดใหม่:

  • การทอแบบโพสต์คอมไพล์หากการประมวลผล JAR ไบนารีเป็นที่ยอมรับ

  • การทอผ้าตามเวลาโหลดซึ่งต้องเปิดใช้งานตัวแทนการทอใน VM

โปรดดูเอกสารคราส (ลิงค์ด้านบน) และยังมีคู่มือการพัฒนาสิ่งแวดล้อม AspectJ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.