स्टैक ट्रेस - 1

"हाय! आज मैं आपको बताऊंगा कि स्टैक ट्रेस क्या होता है। लेकिन पहले मुझे आपको यह बताना होगा कि स्टैक क्या है।"

"कागजों के ढेर की कल्पना करें - एक निश्चित कर्मचारी के लिए निर्देश। आप ढेर के शीर्ष पर एक नया कार्य रख सकते हैं, या आप ऊपर से एक कार्य ले सकते हैं। इसका मतलब यह है कि कार्यों को उस क्रम में निष्पादित नहीं किया जाएगा जिस क्रम में वे प्राप्त हुए थे। हाल ही में ढेर पर रखा गया कार्य सबसे पहले निष्पादित किया जाएगा। संग्रह के तत्वों को इस तरह संरचित करना एक ढेर बनाता है । "

" जावा के पास इसके लिए एक विशेष संग्रह है - स्टैक । यह एक ऐसा संग्रह है जिसमें 'एक तत्व जोड़ने' और 'एक तत्व लेने (प्राप्त करने)' के तरीके हैं। जैसा कि आप अनुमान लगा सकते हैं, जो तत्व अंतिम जोड़ा गया था वह सबसे पहले होगा लिया जाना।"

"बल्कि सीधा लगता है।"

"बहुत बढ़िया। अब मैं समझाता हूँ कि स्टैक ट्रेस क्या होता है।"

"कल्पना करें कि जावा प्रोग्राम विधि ए में विधि बी कहा जाता है , जिसे विधि सी कहा जाता है , जो बदले में विधि डी कहलाता है। विधि बी से बाहर निकलने के लिए , हमें पहले विधि सी से बाहर निकलना होगा , और ऐसा करने के लिए - हमें पहले विधि डी से बाहर निकलना होगा । यह व्यवहार एक ढेर जैसा दिखता है।"

"आप ऐसा क्यों कहते हैं कि यह इसके जैसा है?"

"हमारे कागजों के ढेर के बीच में कुछ कार्य करने के लिए, उदाहरण के लिए, आपको सबसे पहले इसके ऊपर पड़े सभी कार्यों को निष्पादित करने की आवश्यकता है।"

"कुछ समानता है, लेकिन मुझे यकीन नहीं है कि मैं सब कुछ सही ढंग से समझता हूं।"

"देखो। ढेर तत्वों का एक समूह है। ढेर में कागज के टुकड़ों की तरह। ऊपर से कागज का तीसरा टुकड़ा लेने के लिए, आपको पहले दूसरा लेने की जरूरत है, और उसके लिए आपको पहले लेने की जरूरत है। आप आप हमेशा कागज़ के टुकड़े रख और ले सकते हैं, लेकिन आपको हमेशा सबसे ऊपर का कागज पहले लेना होगा।"

"फ़ंक्शन कॉल के लिए भी यही सच है। मेथड ए कॉल मेथड बी , जो मेथड सी को कॉल करता है। ए से बाहर निकलने के लिए , आपको पहले बी से बाहर निकलना होगा , और ऐसा करने के लिए, आपको सी से बाहर निकलने की जरूरत है ।"

"रुको। अगर मैं समझता हूं कि आप क्या कह रहे हैं, तो स्टैक की पूरी अवधारणा 'कागज का वह टुकड़ा लें जो आखिरी में जोड़ा गया था' और 'आप केवल उस विधि से बाहर निकल सकते हैं जिसे आपने हाल ही में दर्ज किया है'। क्या यह सही है? "

"हां। फ़ंक्शन कॉल के अनुक्रम को 'कॉल स्टैक' या बस 'स्टैक' के रूप में जाना जाता है। अंतिम फ़ंक्शन कहा जाता है जो समाप्त होने वाला पहला फ़ंक्शन है। आइए एक उदाहरण देखें।"

वर्तमान कॉल स्टैक प्राप्त करें और प्रदर्शित करें:
public class ExceptionExample
{
  public static void main(String[] args)
  {
    method1();
  }

  public static void method1()
  {
    method2();
  }

  public static void method2()
  {
    method3();
  }

  public static void method3()
  {
     StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
    for (StackTraceElement element : stackTraceElements)
    {
       System.out.println(element.getMethodName());
    }
  }
}
परिणाम:
getStackTrace
method3
method2
method1
main

"ठीक है। मुझे फ़ंक्शन कॉल के बारे में सबकुछ मिलता है। लेकिन यह स्टैकट्रेस एलिमेंट क्या है?"

"जावा मशीन सभी फ़ंक्शन कॉल का ट्रैक रखती है। उसके लिए, इसका एक विशेष संग्रह है - स्टैक। जब एक फ़ंक्शन दूसरे को कॉल करता है, तो जावा मशीन स्टैक पर एक नया स्टैकट्रेस एलिमेंट ऑब्जेक्ट डालती है। जब कोई फ़ंक्शन समाप्त होता है, तो वह तत्व हटा दिया जाता है स्टैक से। इसका मतलब है कि स्टैक हमेशा 'फंक्शन कॉल के ढेर' की वर्तमान स्थिति के बारे में अप-टू-डेट जानकारी संग्रहीत करता है। "

"प्रत्येक StackTraceElement ऑब्जेक्ट में कॉल की गई विधि के बारे में जानकारी होती है। विशेष रूप से, आप getMethodName विधि का उपयोग करके विधि का नाम प्राप्त कर सकते हैं।"

"आप ऊपर दिए गए उदाहरण में देख सकते हैं कि यह कैसे काम करता है:

1) हमें कॉल स्टैक मिलता है।

2) हम इसके माध्यम से जाने के लिए प्रत्येक लूप का उपयोग करते हैं। मुझे आशा है कि आप भूल नहीं गए हैं कि वह क्या है।

3) हम पद्धति के नामों को System.out में आउटपुट करते हैं ।"

"आकर्षक! और बहुत जटिल भी नहीं। धन्यवाद, ऋषि!"