Bisakah saya mengetahui nilai pengembalian sebelum kembali saat debugging di Eclipse?

99

Apakah mungkin untuk melihat nilai kembali dari suatu metode setelah baris dijalankan dan sebelum penunjuk instruksi kembali ke fungsi pemanggil?

Saya men-debug kode yang tidak dapat saya ubah (baca: tidak ingin mengkompilasi ulang pustaka pihak ketiga) , dan terkadang melompat ke kode yang tidak saya miliki sumbernya atau ekspresi balik memiliki efek samping yang menghentikan saya. dapat menjalankan ekspresi di tab Tampilan .

Seringkali nilai yang dikembalikan digunakan dalam pernyataan gabungan, sehingga tampilan Variabel tidak akan pernah menunjukkan nilai kepada saya (karena itu ingin melihat hasil sebelum kontrol kembali ke fungsi pemanggil).

PEMBARUAN: Saya tidak dapat menggunakan penampil ekspresi karena ada efek samping dalam pernyataan tersebut.

RodeoClown
sumber
7
Itulah mengapa saya beralih ke Versi Komunitas IntelliJ - orang-orang Eclipse sepertinya tidak memahami betapa pentingnya hal ini. (Jika mereka memperbaikinya, saya akan beralih kembali pada hari dirilis.)
@James Mitchell ini sepertinya ide bagus untuk plugin. Saya akan menambahkannya ke daftar yang harus saya lakukan dan akan mencoba melakukannya ketika saya menemukan waktu (tidak segera)
IAdapter
@ user672348 Tetapi bagaimana melakukan itu di IntelliJ IDEA?
Alexey Tigarev
@AlexeyTigarev: IIRC, itu hanya ditampilkan ketika Anda melakukan "Step Return" (atau yang setara).
Blaisorblade
1
Persiapkan diri Anda untuk Eclipse Oxygen (tanggal rilis pertengahan 2017). Tonggak sejarah M2 mencakup fitur ini .
Abdull

Jawaban:

36

Fitur ini ditambahkan ke Eclipse versi 4.7 M2 di bawah Eclipse bug 40912 .

Untuk menggunakannya:

  • melangkahi returnpernyataan (menggunakan "Step Over" atau "Step Return")
  • sekarang baris pertama dalam tampilan variabel akan menunjukkan hasil dari pernyataan kembali, sebagai "[pernyataan xxx] dikembalikan:"

Lihat Eclipse Project Oxygen (4.7) M2 - Baru dan Patut Disimak untuk detailnya.

sleske
sumber
Saya juga. Saya merindukan fitur ini saat menggunakan Eclipse.
m24p
1
Bug Eclipse ini kemudian dibuka kembali pada akhir 2009 . Masih menunggu perbaikan, dengan tidak ada yang ditugaskan, dan tidak ada Target Milestone. :)
Mark A. Fitzgerald
1
Ini telah diperbaiki di build terbaru Eclipse 4.7 (M2 dan seterusnya)
AbdullahC
1
Beberapa informasi tentang cara menggunakan perbaikan dapat ditemukan di New And Noteworthy for 4.7 M2. Cari "Hasil metode setelah operasi langkah" di sini: eclipse.org/eclipse/news/4.7/M2
Joshua Goldberg
@JoshuaGoldberg: Terima kasih telah menunjukkan hal ini - saya mengeditnya menjadi jawabannya.
sleske
34

Menemukan jalan pintas yang sangat bagus untuk ini. Pilih ekspresi yang mengembalikan nilai dan tekan

Ctrl + Shift + D

Ini akan menampilkan nilai pernyataan pengembalian. Ini sangat membantu jika Anda tidak bisa atau tidak ingin mengubah hanya untuk tujuan debugging.

Semoga ini membantu.

Catatan: Belum menguji ini dengan pustaka pihak ketiga, tetapi berfungsi dengan baik untuk kode saya. Menguji ini di Eclipse Java EE IDE untuk Pengembang Web. Versi: Juno Service Release 1

Satish
sumber
4
+1 karena ini berfungsi tidak hanya untuk nilai yang dikembalikan, tetapi untuk ekspresi secara umum. Jauh lebih nyaman daripada menggunakan tab ekspresi. Perlu dicatat ini mengeksekusi kode, jadi jika memiliki efek samping, berhati-hatilah. help.eclipse.org/indigo/…
kambing
1
Ctrl + Shift + Ijuga membantu saya.
Ciro Santilli 郝海东 冠状 病 六四 事件 法轮功
2
seperti yang disebutkan @goat, ini mengeksekusi kode beberapa kali, jadi misalnya jika fungsi melakukan ini return System.currentTimeMillis();, Anda akan mendapatkan hasil yang berbeda dari fungsi yang sebenarnya dikembalikan!
Brad Parks
Setara dengan Apple machine?
Adrien Be
Ini adalah nasihat yang bermasalah - ini akan mengevaluasi ulang ekspresi tersebut, yang dapat menjadi bencana jika memiliki efek samping.
sleske
5

Itulah mengapa saya selalu berpegang pada pola metode berikut:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

Aturan saya:

  1. Hanya satu pernyataan pengembalian, hanya di akhir metode (akhirnya diizinkan setelah itu)
  2. Selalu memiliki hasil panggilan lokal yang menyimpan nilai yang dikembalikan, mulai dari default.

Secara alami, pengambil yang paling sepele dikecualikan.

zvikico.dll
sumber
3
Hai zvikico - ketika saya mengerjakan kode saya sendiri, saya biasanya menggunakan pola yang serupa. Sayangnya, masalah saya adalah ketika saya menggunakan kode yang tidak ditulis atau dimodifikasi oleh saya. : S
RodeoClown
Saya melakukan ini juga, tetapi SonarLint mengeluh .... sekarang saya
mengelak
@WitoldKaczurba itu pendapat Anda, dan itu bagus. Terimalah saja bahwa ada pendapat lain, dan tunjukkan rasa hormat kepada orang yang melakukannya.
zvikico
Hai zvikco. Terima kasih atas pesannya. Saya menerima bahwa ada pendekatan yang berbeda tetapi saya merujuk ke pmd.sourceforge.io/pmd-4.3.0/rules/… . Cheers
Witold Kaczurba
2

Saya juga penasaran untuk mempelajari jawaban atas pertanyaan ini.

Dulu, ketika berurusan dengan pustaka pihak ke-3 seperti itu, yang saya lakukan adalah membuat kelas pembungkus atau kelas anak yang mendelegasikan ke kelas induk dan melakukan debug di kelas pembungkus / anak. Ini membutuhkan kerja ekstra.

DJ.
sumber
1
Masalah dengan solusi ini (selain yang Anda catat tentang pekerjaan tambahan) adalah bahwa ini hanya berfungsi jika Anda tidak memiliki banyak kelas / metode jauh di dalam pustaka eksternal. Tetapi ini berguna ketika Anda berurusan dengan metode lapisan luar.
RodeoClown
0

Yang sulit. Pengalaman saya, di luar Eclipse, adalah bahwa jika Anda mungkin perlu melihat nilai yang dikembalikan, yang terbaik adalah menugaskannya ke variabel lokal dalam fungsi sehingga pernyataan pengembaliannya sederhana return varname;dan tidak return(some * expression || other);. Namun, itu tidak terlalu membantu Anda karena Anda mengatakan Anda tidak dapat (atau tidak ingin) mengubah atau bahkan mengkompilasi ulang kode. Jadi, saya tidak punya jawaban yang bagus untuk Anda - mungkin Anda perlu mempertimbangkan kembali kebutuhan Anda.

Jonathan Leffler
sumber
Dalam kode saya, saya biasanya memiliki langkah perantara sehingga saya dapat memeriksa hasilnya, tetapi beberapa kode yang saya gunakan memiliki terlalu banyak overhead organisasi untuk dimodifikasi (terutama jika perpustakaan diperbarui, tidak benar-benar ingin mempertahankan versi bercabang hanya untuk debugging).
RodeoClown
0

Bergantung pada pernyataan pengembalian, Anda dapat menyorot ekspresi yang dikembalikan dan dari menu klik kanan, seharusnya ada sesuatu seperti "evaluasi ekspresi" (Saya tidak memiliki gerhana di depan saya sekarang, tapi seperti itu ). Ini akan menunjukkan kepada Anda apa yang akan dikembalikan.

stephmara
sumber
4
Masalahnya adalah saat mengevaluasi fitur pengembalian memiliki efek samping (seperti entri database yang dibuat misalnya), mengevaluasi ekspresi pengembalian akan mengubah status sistem. Terima kasih atas sarannya.
RodeoClown
0

Ini agak dibuat-buat, tetapi sepertinya tidak ada cara yang sederhana:

Anda dapat menggunakan AspectJ untuk melengkapi JAR dengan aspek-aspek yang mendapatkan nilai kembalian dari metode yang Anda minati. Menurut dokumentasi Eclipse, program AspectJ dapat di- debug seperti program lain.

Ada dua opsi untuk menenun kelas Anda tanpa mengompilasi ulang perpustakaan:

  • Tenun pasca-kompilasi jika pemrosesan JAR biner dapat diterima;

  • Penenunan waktu muat, yang membutuhkan pengaktifan agen penenun di VM.

Lihat dokumentasi gerhana (tautan di atas) dan juga Panduan Lingkungan Pengembangan AspectJ .

Olivier
sumber