यह एक शानदार गहन सप्ताह रहा है। नया YouTube चैनल पाठ्यक्रम को सब्सक्रिप्शन के साथ विस्फोट कर रहा है; यह अभी तीसरे हफ्ते में प्रवेश कर रहा है...
कोर्स की वेबसाइट अब लाइव है; आप पूरे कोर्स को वहां देख सकते हैं, हालांकि मैं हर समय वीडियो जोड़ रहा हूं और लगभग 1/3 काम किया है।
अभी, इसमें 3 घंटे 17 मिनट की सामग्री है। मेरे पास जोड़ने के लिए एक और घंटे की सामग्री तैयार है, और मैं कई और पर काम कर रहा हूं। मुझे पूरा यकीन है कि पूरा होने पर कोर्स 6 घंटे से अधिक का होगा।
मैं कुछ अन्य दिलचस्प वीडियो पर भी काम कर रहा हूं, जैसे कि खुद को क्रमबद्धता के कारनामों से बचाने के बारे में। मैं आने वाले हफ्तों में इसे कवर करते हुए एक पूरा ब्लॉग पोस्ट लिखूंगा।
यदि आपके कोई प्रश्न, विचार या विचार हैं, तो मुझे आपसे सुनना अच्छा लगेगा। नीचे इस सप्ताह का वीडियो और प्रतिलेख है।
स्केल पर डिबगिंग के तीसरे भाग में आपका स्वागत है जहां हम पेशेवरों की तरह बग का शिकार करना सीखते हैं!
इस सेक्शन में, हम वॉच एक्सप्रेशंस पर चर्चा करेंगे जो डिबगिंग की आधारशिला हैं। यह इतना महत्वपूर्ण है कि मैं इस विषय पर बाद में फिर से विचार करूंगा।
घड़ी क्षेत्र स्क्रीन के नीचे स्थित क्षेत्र है
IntelliJ में, हम कोड के बगल में वॉच एक्सप्रेशन भी एम्बेड कर सकते हैं। घड़ी डिबगर की सबसे महत्वपूर्ण क्षमताओं में से एक है। इस तरह हम देख सकते हैं कि डीबगर में क्या हो रहा है।
लेकिन मैं इससे कहीं ज्यादा गहराई तक जाऊंगा। विशेष रूप से ऑब्जेक्ट मार्किंग के लिए जो अब तक के सबसे अच्छे डिबगर फीचर्स में से एक है।
क्या आप कभी किसी विधि से केवल यह सोचने के लिए लौटे हैं, "उस विधि ने क्या लौटाया?"
यह विशेष रूप से तब होता है जब वापसी मान एक चर में संग्रहीत नहीं होता है। सौभाग्य से, आईडीई के पास हमारे लिए उस मूल्य को बचाने का विकल्प है ताकि हम तुरंत इसका निरीक्षण कर सकें!
इस विकल्प को सक्षम करके, हम भविष्य के सभी तरीकों से वापसी मान देख सकते हैं। अगर हम isPrime
मेथड में कदम रखते हैं और फिर बाहर निकलते हैं, तो आप यहां नीचे मेथड के लिए रिटर्न वैल्यू देख पाएंगे।
मूल्यांकन अभिव्यक्ति डिबगर की शानदार विशेषताओं में से एक है जिसका हम पर्याप्त उपयोग नहीं करते हैं।
हम राइट-क्लिक मेनू से एक्सप्रेशन डायलॉग डायलॉग लॉन्च कर सकते हैं और किसी भी वैध जावा एक्सप्रेशन में टाइप कर सकते हैं। यह एक शक्तिशाली उपकरण है जो किसी भी विधि को लागू कर सकता है, अंकगणित कर सकता है और परिणामस्वरूप चर के मान को भी बदल सकता है।
यदि आपको किसी ऐसी चीज का अनुकरण करने की आवश्यकता है जिसका वर्तमान कोड में परीक्षण करना कठिन है, तो यह वह स्थान है जहां आप मंच के साथ खेल सकते हैं और "जंगली सिद्धांतों" का परीक्षण कर सकते हैं।
यह जावा के नए संस्करणों में हमारे पास मौजूद आरईपीएल की तरह है, लेकिन यह कई मायनों में बेहतर है क्योंकि हम अपने एप्लिकेशन के संदर्भ में कोड निष्पादित कर सकते हैं।
अगर मेरे पास कोई तरीका है जो गलत मान लौटाता है, तो मैं अक्सर कॉल को मूल्यांकन संवाद में कॉपी करता हूं और "क्या काम करता है" देखने के लिए कॉल के विभिन्न संयोजनों को आजमाता हूं।
पुनः आरंभ किए बिना सभी विकल्पों को आज़माने से हमारा बहुत समय बच सकता है!
आप इस संवाद को Alt-F8
कुंजी संयोजन से लॉन्च कर सकते हैं।
IntelliJ में देखने की क्षमता बिल्कुल शानदार है।
IntelliJ हमें संदर्भ मेनू से "इनलाइन वॉच जोड़ें" का चयन करके घड़ी को सीधे IDE संपादक में एम्बेड करने देता है। यह एक अद्भुत विशेषता है, जहाँ तक मुझे पता है, JetBrains के लिए अद्वितीय है।
एक बार चुने जाने के बाद, घड़ी उस पंक्ति के ठीक बगल में दिखाई देती है जहां हमने इनलाइन घड़ी जोड़ी थी जिससे कोड के साथ मूल्यांकन करना आसान हो जाता है। एक ही लाइन पर बार-बार लौटने पर यह बहुत सुविधाजनक होता है।
हम मानक घड़ी का भी उपयोग कर सकते हैं जो अन्य चरों के साथ तत्वों को जोड़ेगी। यह उन वस्तुओं के लिए उपयोगी है जिन्हें हम कोड के बड़े क्षेत्रों में ट्रैक करना चाहते हैं। जैसे-जैसे हम आगे बढ़ते हैं, मेरे पास देखने के क्षेत्र के बारे में कहने के लिए बहुत कुछ है, लेकिन अभी के लिए इसे होल्ड पर रखें।
सेट वैल्यू एक ऐसी सुविधा है जिसे मैं डिबगिंग करते समय अक्सर उपयोग करना भूल जाता हूं।
यह शर्म की बात है क्योंकि यह बहुत शक्तिशाली है। हम किसी भी फील्ड पर राइट-क्लिक करके और सेट वैल्यू का चयन करके उसकी वैल्यू सेट कर सकते हैं।
इसे तेज करने के लिए हम F2
का भी उपयोग कर सकते हैं
मैं मूल्य को किसी भी मनमाने मूल्य में बदल सकता हूं। यह उन वस्तुओं पर भी लागू हो सकता है जहाँ मैं एक मौजूदा मान निर्दिष्ट कर सकता हूँ या एक निर्माण विधि, एक नया कथन, या कोई भी अभिव्यक्ति जो मैं चाहता हूँ।
यह एक उल्लेखनीय शक्तिशाली विशेषता है जहां हम उस स्थिति को पुन: उत्पन्न करने के लिए वस्तु को गतिशील रूप से बदल सकते हैं जिसे हम परीक्षण करना चाहते हैं।
हम इस क्षमता को जम्प टू लाइन के साथ जोड़ सकते हैं जिसकी हमने पहले चर्चा की थी और कई अलग-अलग क्रमपरिवर्तन के माध्यम से एक विधि का परीक्षण कर सकते हैं। यहां तक कि वे भी जो सामान्य रूप से पुनरुत्पादित नहीं हो सकते हैं। एक अच्छा उदाहरण कोड होगा जो मेरे पास है जो केवल विंडोज़ पर चलता है। लेकिन मेरे पास एक मैक है।
मैं केवल स्थैतिक चर का मान बदलता हूं जो वर्तमान ऑपरेटिंग सिस्टम को इंगित करता है और उस कोड का परीक्षण करता है।
ऑब्जेक्ट मार्किंग सबसे अच्छी विशेषताओं में से एक है जिसकी हम इस पाठ्यक्रम में चर्चा करेंगे और यह लगभग अज्ञात है।
यह थोड़ा सूक्ष्म है; सबसे पहले, हम थ्रेड. Thread.currentThread()
के लिए एक घड़ी जोड़ेंगे जो वर्तमान थ्रेड का प्रतिनिधित्व करने वाली वस्तु का उदाहरण देता है।
जैसा कि आप देख सकते हैं, मैं घड़ी में वर्तमान धागा देख सकता हूं।
अब, मैं इस विधि को बार-बार चला सकता हूं और वर्तमान थ्रेड देख सकता हूं; क्या विधि हमेशा एक ही धागे से निष्पादित होती है?
ठीक है, मैं थ्रेड आईडी देख सकता हूं, और हां। यह ऐसा ही है। तो, यह शायद थ्रेड-सुरक्षित है। लेकिन मैं इसे कैसे सत्यापित कर सकता हूं?
मैं आमतौर पर कागज के एक टुकड़े पर ऑब्जेक्ट आईडी या चर के सूचक को लिखता हूं और जांचता हूं कि क्या यह समान मूल्य है। यह दर्द है और स्केल नहीं करता है। मैं कितनी बार बार-बार जारी रखें दबा सकता हूं?
राइट-क्लिक मेनू में, मैं मार्क ऑब्जेक्ट का चयन करता हूं और मनमाना नाम टाइप करता हूं। MyThread
इस मामले में, एक बार ऐसा करने के बाद, मैं ओके दबा सकता हूं
यह वर्तमान थ्रेड के मान को अभी नए लेबल से बदल देता है। इसलिए, हम गलत तरीके से मान सकते हैं कि यह केवल एक घड़ी की अभिव्यक्ति का नाम है। यह नहीं है। हमने एक नया चर घोषित किया और इसे MyThread
नाम दिया।
हमने उस वेरिएबल में वॉच एक्सप्रेशन के वर्तमान मान को कॉपी किया। अब हम उस वेरिएबल का इलाज कर सकते हैं क्योंकि हम IDE में अधिकांश वेरिएबल्स का इलाज करते हैं।
हम यहां मूल्य का मूल्यांकन कर सकते हैं और वह सब कुछ प्राप्त कर सकते हैं जो हम चाहते हैं। नामकरण टकराव से बचने के लिए IntelliJ द्वारा जोड़े गए _DebugLabel
प्रत्यय पर ध्यान दें, लेकिन इसके अलावा, हम इस ऑब्जेक्ट पर किसी भी ऑपरेशन को लागू कर सकते हैं जैसे कि नाम प्राप्त करें या यहां तक कि निजी फ़ील्ड नाम तक पहुंचें।
लेकिन यह बहुत बेहतर हो जाता है …
आइए इस पद्धति में एक ब्रेकप्वाइंट जोड़ते हैं, एक पूरी तरह से मानक ब्रेकप्वाइंट जैसा हमने पहले किया था।
यह एक मानक सशर्त विराम बिंदु होगा; हम जल्द ही उनके बारे में गहराई से चर्चा करेंगे, लेकिन अभी, आपको बस इतना जानने की जरूरत है कि मैं एक ऐसी स्थिति को परिभाषित कर सकता हूं जो यह निर्धारित करेगी कि ब्रेकपॉइंट रुकेगा या नहीं।
आइए ज़ूम इन करें।
हालत में टाइप करते हैं; मैं MyThread
की तुलना थ्रेड के वर्तमान मान से कर सकता हूं। ध्यान दें कि यह स्थिति उसी के अनुसार व्यवहार करेगी क्योंकि MyThread
का मान Thread.currentThread()
के मूल वॉच स्टेटमेंट से स्वतंत्र है।
इसलिए, यदि वर्तमान धागा वास्तव में अलग है तो ब्रेकपॉइंट इस बिंदु पर रुक जाएगा।
कई वस्तुओं से निपटने के दौरान यह बेहद उपयोगी है। इस मामले में, मैं सचमुच जांच कर सकता हूं कि विधि एक ही धागे से हिट हो जाएगी या नहीं। मैं कागज के एक टुकड़े पर उनके संकेत लिखने के बजाय किसी भी वस्तु की तुलना करने के लिए इसका उपयोग कर सकता हूँ!
हां। मैं सचमुच कागज के एक टुकड़े के साथ बैठूंगा और यह सुनिश्चित करने के लिए सूचक पते की प्रतिलिपि बनाऊंगा कि अगर मैं इसे फिर से देखूं तो मुझे यह सही लगा। यह कई मायनों में बेहतर है!
मैं अक्सर जेपीए जैसे एपीआई के साथ इसका उपयोग करता हूं जहां कभी-कभी हमारे पास एक ही पहचान के साथ दो ऑब्जेक्ट उदाहरण हो सकते हैं। इसका पता लगाना वाकई मुश्किल है। बस एक वस्तु को चिह्नित करें, और फिर आप तुरंत देख सकते हैं कि यह एक अलग उदाहरण है।
चूंकि यह मामला स्पष्ट रूप से सिंगल-थ्रेडेड है, इसलिए ब्रेकप्वाइंट फिर कभी हिट नहीं होगा। लेकिन यह बहुत विस्तृत मामलों के लिए अच्छा काम करता है और एक उल्लेखनीय उपयोगी उपकरण है!
अगला, हम ब्रेकप्वाइंट और उनके द्वारा की जा सकने वाली आश्चर्यजनक चीजों के बारे में गहराई से जानेंगे। यह एक गहरा गोता लगाने वाला वीडियो है जिसे आप मिस नहीं करना चाहेंगे।
यदि आपके कोई प्रश्न हैं, तो कृपया टिप्पणी अनुभाग का उपयोग करें। शुक्रिया!