Tôi có thể tìm ra giá trị trả về trước khi trả về khi gỡ lỗi trong Eclipse không?


99

Có thể thấy giá trị trả về của một phương thức sau khi dòng đã được chạy và trước khi con trỏ lệnh quay trở lại hàm đang gọi không?

Tôi đang gỡ lỗi mã Tôi không thể sửa đổi (đọc: không muốn biên dịch lại thư viện của bên thứ ba) và đôi khi nó nhảy sang mã mà tôi không có nguồn hoặc biểu thức trả về có các tác dụng phụ khiến tôi không thể. chỉ có thể chạy biểu thức trong tab Hiển thị .

Thường thì giá trị trả về được sử dụng trong một câu lệnh ghép và do đó, dạng xem Biến sẽ không bao giờ hiển thị cho tôi giá trị (do đó muốn xem kết quả trước khi điều khiển quay trở lại hàm gọi).

CẬP NHẬT: Tôi không thể sử dụng trình xem biểu thức vì có các hiệu ứng phụ trong câu lệnh.


7
Đó là lý do tại sao tôi chuyển sang Phiên bản cộng đồng của IntelliJ - những người sử dụng Eclipse dường như không hiểu điều này quan trọng như thế nào. (Nếu họ bao giờ sửa chữa nó, tôi sẽ chuyển trở lại vào ngày nó được phát hành.)

@James Mitchell, đây có vẻ như là một ý tưởng tuyệt vời cho một plugin. Tôi sẽ thêm nó vào tôi todo danh sách và sẽ cố gắng để làm điều đó khi tôi tìm thấy thời gian (không sớm)
IAdapter

@ user672348 Nhưng làm thế nào để làm điều đó trong IntelliJ IDEA?
Alexey Tigarev

@AlexeyTigarev: IIRC, nó chỉ hiển thị khi bạn thực hiện "Step Return" (hoặc tương đương).
Blaisorblade

1
Chuẩn bị cho Eclipse Oxygen (ngày phát hành giữa năm 2017). Mốc M2 bao gồm tính năng này .
Abdull

Câu trả lời:


35

Tính năng này đã được thêm vào Eclipse phiên bản 4.7 M2 dưới lỗi Eclipse 40912 .

Để dùng nó:

  • bước qua returncâu lệnh (sử dụng "Step Over" hoặc "Step Return")
  • bây giờ dòng đầu tiên trong dạng xem biến sẽ hiển thị kết quả của câu lệnh trả về, như "[câu lệnh xxx] trả về:"

Xem Dự án Eclipse Oxy (4.7) M2 - Mới và đáng chú ý để biết chi tiết.


Tôi cũng vậy. Tôi bỏ lỡ tính năng này khi sử dụng Eclipse.
m24p

1
Lỗi Eclipse này sau đó đã được mở lại vào cuối năm 2009 . Tuy nhiên, vẫn đang chờ một bản sửa lỗi, không có ai được chỉ định và không có Cột mốc Mục tiêu. :)
Mark A. Fitzgerald

1
Điều này đã được cố định trong gần đây xây dựng của Eclipse 4.7 (M2 trở đi)
AbdullahC

1
Một số thông tin về cách sử dụng bản sửa lỗi có thể được tìm thấy trong New And Noteworthy cho 4.7 M2. Tìm kiếm "Kết quả phương pháp sau khi hoạt động từng bước" tại đây: eclipse.org/eclipse/news/4.7/M2
Joshua Goldberg

@JoshuaGoldberg: Cảm ơn bạn đã chỉ ra điều này - Tôi đã chỉnh sửa nó thành câu trả lời.
sleske

34

Tìm thấy một lối tắt thực sự tốt cho việc này. Chọn biểu thức trả về giá trị và nhấn

Ctrl + Shift + D

Điều này sẽ hiển thị giá trị của câu lệnh trả về. Điều này thực sự hữu ích trong trường hợp bạn không thể hoặc không muốn thay đổi chỉ vì mục đích gỡ lỗi.

Hi vọng điêu nay co ich.

Lưu ý: Chưa kiểm tra điều này với các thư viện của bên thứ ba, nhưng nó đang hoạt động tốt cho mã của tôi. Đã kiểm tra điều này trên Eclipse Java EE IDE dành cho nhà phát triển web. Phiên bản: Bản phát hành dịch vụ Juno 1


4
+1 vì điều này không chỉ hoạt động đối với các giá trị trả về mà còn đối với các biểu thức nói chung. Tiện lợi hơn nhiều so với việc sử dụng tab biểu thức. Cần lưu ý rằng điều này thực thi mã, vì vậy nếu nó có tác dụng phụ, hãy cẩn thận. help.eclipse.org/indigo/…

1
Ctrl + Shift + Icũng hữu ích cho tôi.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功

2
như @goat đã đề cập, điều này thực thi mã nhiều lần, vì vậy, ví dụ: nếu hàm thực hiện điều này return System.currentTimeMillis();, thì bạn sẽ nhận được kết quả khác với hàm thực sự được trả về!
Brad Parks

Tương đương trên một Apple machine?
Adrien Be

Đây là lời khuyên có vấn đề - điều này sẽ đánh giá lại biểu hiện, điều này có thể gây tai hại nếu nó có tác dụng phụ.
sleske


5

Đó là lý do tại sao tôi luôn gắn bó với mô hình sau cho các phương pháp:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Luật của tôi:

  1. Chỉ một câu lệnh trả về, chỉ ở cuối phương thức (cuối cùng được phép sau nó)
  2. Luôn có một kết quả được gọi cục bộ giữ giá trị trả về, bắt đầu từ giá trị mặc định.

Đương nhiên, những người tầm thường nhất được miễn.


3
Này zvikico - khi tôi đang làm việc trên mã của riêng mình, tôi thường sử dụng một mẫu tương tự. Thật không may, vấn đề của tôi là khi tôi sử dụng mã không phải do tôi viết hoặc sửa đổi. : S
RodeoClown

Tôi cũng làm điều này, nhưng SonarLint đang phàn nàn .... bây giờ tôi đang phân
vân

@WitoldKaczurba đó là ý kiến ​​của bạn, và điều đó ổn. Chỉ cần chấp nhận rằng có những ý kiến ​​khác và thể hiện sự tôn trọng đối với những người có ý kiến ​​đó.
zvikico

Chào zvikco. Cảm ơn vì tin nhắn. Tôi chấp nhận rằng có nhiều cách tiếp cận khác nhau nhưng tôi đã tham khảo pmd.sourceforge.io/pmd-4.3.0/rules/… . Cheers
Witold Kaczurba

2

Tôi cũng tò mò muốn tìm hiểu câu trả lời cho câu hỏi này.

Trước đây, khi xử lý thư viện của bên thứ 3 như vậy, những gì tôi đã làm là tạo một lớp bao bọc hoặc lớp con ủy nhiệm cho lớp cha và thực hiện gỡ lỗi của tôi trong lớp bao bọc / lớp con. Nó phải làm việc thêm mặc dù.


1
Vấn đề với giải pháp này (ngoài giải pháp bạn đã lưu ý về việc làm thêm) là nó chỉ hoạt động nếu bạn không có nhiều lớp / phương thức nằm sâu bên trong thư viện bên ngoài. Nhưng nó rất hữu ích khi bạn đang xử lý lớp bên ngoài của các phương thức.
RodeoClown 20/10/08


0

Một khó khăn. Kinh nghiệm của tôi, bên ngoài Eclipse, là nếu bạn có thể cần xem giá trị trả về, tốt nhất là gán nó cho một biến cục bộ trong hàm để câu lệnh trả về đơn giản return varname;và không return(some * expression || other);. Tuy nhiên, điều đó không hữu ích cho bạn một cách đáng sợ vì bạn nói rằng bạn không thể (hoặc không muốn) sửa đổi hoặc thậm chí biên dịch lại mã. Vì vậy, tôi không có câu trả lời tốt cho bạn - có lẽ bạn cần xem xét lại yêu cầu của mình.


Trong mã của tôi, tôi thường có bước trung gian để tôi có thể kiểm tra kết quả, nhưng một số mã tôi đang sử dụng có quá nhiều chi phí tổ chức để sửa đổi (đặc biệt là nếu thư viện được cập nhật, tôi không thực sự muốn duy trì một phiên bản đã chia nhỏ chỉ để gỡ lỗi).
RodeoClown

0

Tùy thuộc vào câu lệnh trả về, bạn có thể đánh dấu biểu thức đang được trả về và từ menu chuột phải, sẽ có một cái gì đó như "đánh giá biểu thức" (Tôi không có nhật thực trước mặt tôi, nhưng nó giống như vậy ). Nó sẽ cho bạn thấy những gì sẽ được trả lại.


4
Vấn đề là khi đánh giá tính năng trả về có tác dụng phụ (chẳng hạn như các mục nhập cơ sở dữ liệu đang được tạo), việc đánh giá biểu thức trả về sẽ thay đổi trạng thái hệ thống. Nhờ đề nghị mặc dù.
RodeoClown 19/10/08

0

Điều này hơi xa vời, nhưng dường như không có cách nào đơn giản:

Bạn có thể sử dụng AspectJ để tạo thiết bị cho JAR với các khía cạnh nắm giữ giá trị trả về của các phương thức mà bạn quan tâm. Theo tài liệu của Eclipse, các chương trình AspectJ có thể được gỡ lỗi giống như các chương trình khác.

Có hai tùy chọn để dệt các lớp của bạn mà không cần biên dịch lại thư viện:

  • Quá trình dệt sau biên dịch nếu việc xử lý JAR nhị phân được chấp nhận;

  • Dệt theo thời gian tải, yêu cầu kích hoạt tác nhân dệt trong VM.

Xem tài liệu về nhật thực (liên kết ở trên) và cả Hướng dẫn về Môi trường Phát triển AspectJ .

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.