क्या मैं ग्रहण में डिबगिंग करते समय लौटने से पहले रिटर्न वैल्यू का पता लगा सकता हूं?


99

क्या लाइन चलने के बाद और निर्देश सूचक को कॉलिंग फ़ंक्शन पर लौटने से पहले किसी विधि का रिटर्न मान देखना संभव है?

मैं डिबगिंग कोड हूं जिसे मैं संशोधित नहीं कर सकता (पढ़ें: किसी तीसरे पक्ष के पुस्तकालय को फिर से संकलित नहीं करना चाहता) , और कभी-कभी यह कोड के लिए कूदता है मेरे पास स्रोत नहीं है या वापसी अभिव्यक्ति के दुष्प्रभाव हैं जो मुझे रोकते हैं केवल प्रदर्शन टैब में अभिव्यक्ति चलाने में सक्षम ।

अक्सर रिटर्न वैल्यू का उपयोग कंपाउंड स्टेटमेंट में किया जाता है, और इसलिए वेरिएबल्स व्यू मुझे कभी भी वैल्यू नहीं दिखाएगा (इसलिए कॉलिंग फ़ंक्शन पर नियंत्रण रिटर्न से पहले परिणाम देखना चाहता है)।

अद्यतन: मैं अभिव्यक्ति दर्शक का उपयोग नहीं कर सकता क्योंकि बयान में दुष्प्रभाव हैं।


7
यही कारण है कि मैं IntelliJ के सामुदायिक संस्करण में बदल गया - ग्रहण करने वाले लोगों को बस यह समझ में नहीं आता है कि यह कितना महत्वपूर्ण है। (यदि वे कभी इसे ठीक कर लेते हैं, तो मैं इसे जारी किए गए दिन वापस स्विच करूंगा।)

@ जेम्स मिशेल यह एक प्लगइन के लिए एक महान विचार की तरह लग रहा है। मैं इसे टूडू सूची में जोड़ दूंगा और समय मिलने पर (जल्द नहीं) करने की कोशिश
करूंगा

@ user672348 लेकिन IntelliJ IDEA में कैसे करें?
एलेक्सी तिगारेव

@AlexeyTigarev: IIRC, यह तब प्रदर्शित होता है जब आप "स्टेप रिटर्न" (या समतुल्य) करते हैं।
Blaisorblade

1
ग्रहण ऑक्सीजन के लिए खुद को संभालो (मध्य 2017 रिलीज की तारीख)। एम 2 मील के पत्थर में यह सुविधा शामिल है
अब्दुल

जवाबों:


36

इस फीचर को ग्रहण बग 40912 के तहत ग्रहण संस्करण 4.7 एम 2 में जोड़ा गया था ।

इसके प्रयेाग के लिए:

  • returnबयान पर कदम ("स्टेप ओवर" या "स्टेप रिटर्न" का उपयोग करके)
  • अब चर दृश्य में पहली पंक्ति रिटर्न स्टेटमेंट का परिणाम दिखाएगी, जैसा कि "[स्टेटमेंट xxx] वापस लौटा:"

विवरण के लिए ग्रहण प्रोजेक्ट ऑक्सीजन (4.7) एम 2 - नया और उल्लेखनीय देखें।


मैं भी। ग्रहण का उपयोग करते समय मुझे यह सुविधा याद आती है।
m24p

1
इस ग्रहण बग को बाद में 2009 के अंत में फिर से खोल दिया गया था । अभी भी एक फिक्स का इंतजार है, हालांकि, कोई भी असाइन नहीं किया गया है, और कोई लक्ष्य मील का पत्थर नहीं है। :)
मार्क ए। फिजराल्ड़ १ '

1
यह ग्रहण 4.7 (एम 2 बाद) के हाल के निर्माणों में तय किया गया है
अब्दुल्लाह

1
फिक्स का उपयोग कैसे करें के लिए कुछ जानकारी 4.7 एम 2 के लिए न्यू एंड नोटरी में मिल सकती है। यहां "स्टेप ऑपरेशंस के बाद मेथड रिजल्ट" देखें: eclipse.org/eclipse/news/4.7/M2
जोशुआ गोल्डबर्ग

@ जोशुआगोल्डबर्ग: इसे इंगित करने के लिए धन्यवाद - मैंने इसे उत्तर में संपादित किया।
सालेके

34

इसके लिए एक बहुत अच्छा शॉर्टकट मिला। अभिव्यक्ति का चयन करें जो मान लौटाता है और दबाएं

Ctrl + Shift + D

यह रिटर्न स्टेटमेंट का मूल्य प्रदर्शित करेगा। यह उन मामलों में वास्तव में मददगार है जहां आप केवल डिबगिंग उद्देश्य के लिए बदलाव नहीं कर सकते हैं या नहीं करना चाहते हैं।

उम्मीद है की यह मदद करेगा।

नोट: तीसरे पक्ष के पुस्तकालयों के साथ इसका परीक्षण नहीं किया है, लेकिन यह मेरे कोड के लिए ठीक काम कर रहा है। वेब डेवलपर्स के लिए ग्रहण जावा ईई आईडीई पर यह परीक्षण किया गया । संस्करण: जूनो सेवा रिलीज़ 1


4
+1 क्योंकि यह न केवल रिटर्न वैल्यू के लिए काम करता है, बल्कि सामान्य तौर पर एक्सप्रेशन के लिए भी काम करता है। भाव टैब का उपयोग करने की तुलना में बहुत अधिक सुविधाजनक है। यह ध्यान दिया जाना चाहिए कि यह कोड निष्पादित करता है, इसलिए यदि इसके दुष्प्रभाव हैं, तो सावधान रहें। help.eclipse.org/indigo/…
बकरी

1
Ctrl + Shift + Iमेरे लिए भी मददगार था।
सिरो सेंटिल्ली 郝海东 i iro 事件 法轮功 '

2
जैसा कि @goat ने उल्लेख किया है, यह कोड को कई बार निष्पादित करता है, इसलिए उदाहरण के लिए यदि फ़ंक्शन ने ऐसा किया है return System.currentTimeMillis();, तो आपको वास्तव में वापस आए फ़ंक्शन की तुलना में एक अलग परिणाम मिलेगा!
ब्रैड पार्क्स

एक पर बराबर Apple machine?
बी

यह समस्याग्रस्त सलाह है - यह अभिव्यक्ति का पुनर्मूल्यांकन करेगा, जो इसके दुष्प्रभाव होने पर विनाशकारी हो सकता है।
१५


5

इसलिए मैं हमेशा तरीकों के लिए निम्नलिखित पैटर्न के साथ रहता हूं:

MyReturnedType foo() {
     MyReturnedType   result = null;

     // do your stuff, modify the result or not

     return result;
}

मेरे नियम:

  1. केवल एक रिटर्न स्टेटमेंट, केवल विधि के अंत में (अंत में इसके बाद अनुमति दी गई है)
  2. हमेशा एक स्थानीय नाम का परिणाम होता है जो एक डिफ़ॉल्ट से शुरू होकर लौटा मूल्य रखता है।

स्वाभाविक रूप से, सबसे तुच्छ पाने वालों को छूट है।


3
हे zvikico - जब मैं अपने कोड पर काम कर रहा हूं, तो मैं आमतौर पर एक समान पैटर्न का उपयोग करता हूं। दुर्भाग्य से, मेरी समस्या तब है जब मैं उस कोड का उपयोग कर रहा हूं जो मेरे द्वारा लिखित या संशोधित नहीं है। : एस
रोडियोक्लोवन

मैं यह भी करता हूं, लेकिन सोनारलिंट शिकायत कर रहा है .... अब मैं बराबर कर रहा हूं: stackoverflow.com/questions/31733811/…
HDave

@WitoldKaczurba आपकी राय है, और यह ठीक है। बस स्वीकार करते हैं कि अन्य राय हैं, और जो करते हैं उनके प्रति कुछ सम्मान दिखाते हैं।
zvikico

हाय ज़विकको। संदेश के लिए धन्यवाद। मैं स्वीकार करता हूं कि अलग-अलग दृष्टिकोण हैं लेकिन मैंने pmd.sourceforge.io/pmd-4.3.0/rules/… का उल्लेख किया है । चीयर्स
विटॉल्ड काकज़ुरबा

2

मैं इस प्रश्न का उत्तर जानने के लिए उत्सुक हूं।

अतीत में, जब उस तरह 3rd पार्टी लाइब्रेरी से निपटना, मैंने जो किया वह एक रैपर क्लास या चाइल्ड क्लास बनाना है जो पेरेंट क्लास को सौंपता है और रैपर / चाइल्ड क्लास में अपना डिबगिंग करता है। हालांकि यह अतिरिक्त काम करता है।


1
इस समाधान के साथ समस्या (अतिरिक्त काम के बारे में आपके द्वारा उल्लेखित के अलावा) यह है कि यह केवल तभी काम करता है जब आप बाहरी पुस्तकालय के भीतर कई कक्षाएं / विधियाँ गहरी न हों। लेकिन यह उपयोगी है जब आप तरीकों की बाहरी परत के साथ काम कर रहे हैं।
3


0

मजबूत। एक्लिप्स के बाहर मेरा अनुभव यह है कि अगर आपको रिटर्न वैल्यू देखने की जरूरत है, तो इसे फंक्शन में लोकल वेरिएबल में असाइन करना सबसे अच्छा है, ताकि रिटर्न स्टेटमेंट सिंपल हो return varname;और न हो return(some * expression || other);। हालाँकि, यह आपके लिए बहुत उपयोगी नहीं है क्योंकि आप कहते हैं कि आप (या नहीं करना चाहते हैं) कोड को संशोधित या पुन: स्थापित नहीं कर सकते हैं। इसलिए, मेरे पास आपके लिए एक अच्छा जवाब नहीं है - शायद आपको अपनी आवश्यकता पर पुनर्विचार करने की आवश्यकता है।


मेरे कोड में मेरे पास आम तौर पर मध्यवर्ती चरण होता है, इसलिए मैं परिणाम की जांच कर सकता हूं, लेकिन कुछ कोड जो मैं उपयोग कर रहा हूं उनमें संशोधित करने के लिए बहुत अधिक संगठनात्मक ओवरहेड है (esp। यदि पुस्तकालय अपडेट हो जाता है, तो वास्तव में एक फोर्क संस्करण को बनाए रखना नहीं चाहते हैं। सिर्फ डिबगिंग के लिए)।
रोडियोक्लब

0

वापसी विवरण के आधार पर, आप उस अभिव्यक्ति को हाइलाइट कर सकते हैं जो वापस आ रही है और राइट-क्लिक मेनू से, "मूल्यांकन अभिव्यक्ति" जैसा कुछ होना चाहिए (मेरे सामने अब ग्रहण नहीं है, लेकिन यह ऐसा कुछ है )। यह आपको दिखाएगा कि क्या लौटने वाला है।


4
समस्या तब होती है जब रिटर्न फीचर के मूल्यांकन के साइड-इफेक्ट्स होते हैं (उदाहरण के लिए डेटाबेस प्रविष्टियां बनाई जा रही हैं), रिटर्न एक्सप्रेशन के मूल्यांकन से सिस्टम की स्थिति बदल जाएगी। फिर भी सुझाव के लिए धन्यवाद।
RodeoClown

0

यह थोड़ा दूर की कौड़ी है, लेकिन जैसा कि कोई आसान तरीका नहीं है:

आप उन पहलुओं के साथ JAR लिखवाने के लिए AspectJ का उपयोग कर सकते हैं जो आपके द्वारा रुचि की जाने वाली विधियों के रिटर्न मूल्य को पकड़ते हैं। ग्रहण के प्रलेखन के अनुसार, AspectJ कार्यक्रमों को अन्य कार्यक्रमों की तरह डीबग किया जा सकता है

लाइब्रेरी को फिर से खोलने के बिना अपनी कक्षाओं को बुनाई के लिए दो विकल्प हैं:

  • बाइनरी जार को संसाधित करने के बाद की बुनाई स्वीकार्य है;

  • लोड-टाइम बुनाई, जिसे वीएम में एक बुनाई एजेंट को सक्रिय करने की आवश्यकता होती है।

ग्रहण के दस्तावेज (ऊपर लिंक) और AspectJ विकास पर्यावरण गाइड भी देखें

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.