1. स्टैक ट्रेस प्राप्त करना

स्टैक ट्रेस प्राप्त करना

प्रोग्राम में क्या हो रहा है इसके बारे में जानकारी प्राप्त करने के लिए जावा प्रोग्रामिंग भाषा प्रोग्रामर के लिए कई तरीके प्रदान करती है। और सिर्फ शब्द नहीं।

उदाहरण के लिए, सी ++ प्रोग्राम संकलित होने के बाद, वे मशीन कोड से भरी एक बड़ी फाइल बन जाते हैं, और रनटाइम पर प्रोग्रामर के लिए उपलब्ध सभी मेमोरी के ब्लॉक का पता होता है जिसमें मशीन कोड वर्तमान में निष्पादित होता है। बहुत कुछ नहीं, आइए बताते हैं।

लेकिन जावा के लिए, एक प्रोग्राम के संकलित होने के बाद भी, कक्षाएं कक्षाएं बनी रहती हैं, विधियाँ और चर गायब नहीं होते हैं, और प्रोग्रामर के पास प्रोग्राम में क्या हो रहा है, इसके बारे में जानकारी प्राप्त करने के कई तरीके हैं।

स्टैक ट्रेस

उदाहरण के लिए, किसी प्रोग्राम के निष्पादन के बिंदु पर, आप वर्तमान में निष्पादित की जा रही विधि के वर्ग और नाम का पता लगा सकते हैं। और केवल एक विधि नहीं - आप वर्तमान विधि से विधि कॉल की संपूर्ण श्रृंखला के बारे में जानकारी प्राप्त कर सकते हैं main()

एक सूची जिसमें वर्तमान विधि शामिल है, और जिस विधि ने इसे लागू किया है, और वह विधि जिसे वह कहा जाता है, आदि को स्टैक ट्रेस कहा जाता है । आप इसे इस कथन से प्राप्त कर सकते हैं:

StackTraceElement[] methods = Thread.currentThread().getStackTrace();

आप इसे दो पंक्तियों के रूप में भी लिख सकते हैं:

Thread current = Thread.currentThread();
StackTraceElement[] methods = current.getStackTrace();

वर्ग की स्थैतिक currentThread()विधि Threadकिसी वस्तु का संदर्भ देती है Thread, जिसमें वर्तमान थ्रेड, यानी निष्पादन के वर्तमान थ्रेड के बारे में जानकारी होती है। आप जावा कोर खोज के स्तर 17 और 18 में थ्रेड्स के बारे में अधिक जानेंगे ।

इस Threadऑब्जेक्ट में एक getStackTrace()विधि है, जो StackTraceElementवस्तुओं की एक सरणी लौटाती है, जिनमें से प्रत्येक में एक विधि के बारे में जानकारी होती है। ये सभी तत्व एक साथ मिलकर एक स्टैक ट्रेस बनाते हैं ।

उदाहरण:

कोड
public class Main
{
   public static void main(String[] args)
   {
      test();
   }

   public static void test()
   {
      Thread current = Thread.currentThread();
      StackTraceElement[] methods = current.getStackTrace();

      for(var info: methods)
         System.out.println(info);
   }
}
कंसोल आउटपुट
java.base/java.lang.Thread.getStackTrace(Thread.java:1606)
Main.test(Main.java:11)
Main.main(Main.java:5)

जैसा कि हम उदाहरण के कंसोल आउटपुट में देख सकते हैं, getStackTrace()विधि तीन तत्वों की एक सरणी लौटाती है:

  • getStackTrace()Threadकक्षा की विधि
  • test()Mainकक्षा की विधि
  • main()Mainकक्षा की विधि

इस स्टैक ट्रेस से, हम यह निष्कर्ष निकाल सकते हैं कि:

  • विधि को Main.java फ़ाइल की पंक्ति 11 पर विधि Thread.getStackTrace()द्वारा बुलाया गया थाMain.test()
  • विधि को Main.java फ़ाइल की पंक्ति 5 पर विधि Main.test()द्वारा बुलाया गया थाMain.main()
  • किसी ने विधि को कॉल नहीं किया Main.main()- कॉल की श्रृंखला में यह पहली विधि है।

वैसे, स्क्रीन पर उपलब्ध जानकारी में से कुछ ही दिखाई दे रही थी। बाकी सब कुछ सीधे StackTraceElementवस्तु से प्राप्त किया जा सकता है



2.StackTraceElement

जैसा कि इसके नाम से पता चलता है, वर्ग को स्टैक ट्रेसStackTraceElement तत्व के बारे में जानकारी संग्रहीत करने के लिए बनाया गया था , अर्थात .stack trace

इस वर्ग में निम्नलिखित उदाहरण विधियाँ हैं:

तरीका विवरण
String getClassName()
वर्ग का नाम लौटाता है
String getMethodName()
विधि का नाम लौटाता है
String getFileName()
फ़ाइल का नाम लौटाता है (एक फ़ाइल में कई वर्ग हो सकते हैं)
int getLineNumber()
फ़ाइल में वह पंक्ति संख्या लौटाता है जहाँ विधि को कॉल किया गया था
String getModuleName()
मॉड्यूल का नाम लौटाता है (यह हो सकता है null)
String getModuleVersion()
मॉड्यूल का संस्करण लौटाता है (यह हो सकता है null)

वे वर्तमान कॉल स्टैक के बारे में अधिक संपूर्ण जानकारी प्राप्त करने में आपकी सहायता कर सकते हैं:

कोड कंसोल आउटपुट टिप्पणी
public class Main
{
   public static void main(String[] args)
   {
      test();
   }

   public static void test()
   {
      Thread current = Thread.currentThread();
      StackTraceElement[] methods = current.getStackTrace();

      for(StackTraceElement info: methods)
      {
         System.out.println(info.getClassName());
         System.out.println(info.getMethodName());

         System.out.println(info.getFileName());
         System.out.println(info.getLineNumber());

         System.out.println(info.getModuleName());
         System.out.println(info.getModuleVersion());
         System.out.println();
      }
   }
}
java.lang.Thread
getStackTrace
Thread.java
1606
java.base
11.0.2

Main
test
Main.java
11
null
null

Main
main
Main.java
5
null
null
वर्ग का नाम
विधि का नाम
फ़ाइल का नाम
लाइन नंबर
मॉड्यूल का नाम
मॉड्यूल संस्करण

वर्ग का
नाम विधि का नाम
फ़ाइल का नाम
लाइन नंबर मॉड्यूल
का नाम
मॉड्यूल संस्करण

वर्ग का
नाम विधि का नाम
फ़ाइल का नाम
लाइन नंबर
मॉड्यूल का नाम
मॉड्यूल संस्करण


3. ढेर

आप पहले से ही जानते हैं कि स्टैक ट्रेस क्या है, लेकिन स्टैक (स्टैक क्लास) क्या है?

एक ढेर एक डेटा संरचना है जिसमें आप तत्व जोड़ सकते हैं और जिससे आप तत्वों को पुनः प्राप्त कर सकते हैं। ऐसा करने में, आप केवल अंत से तत्व ले सकते हैं: आप पहले जोड़े गए अंतिम को लेते हैं, फिर दूसरे से अंतिम जोड़े गए, आदि।

स्टैक नाम ही इस व्यवहार का सुझाव देता है, जैसे कि आप पेपर के ढेर के साथ कैसे इंटरैक्ट करेंगे। यदि आप शीट 1, 2 और 3 को स्टैक में रखते हैं, तो आपको उन्हें उल्टे क्रम में पुनः प्राप्त करना होगा: पहले तीसरी शीट, फिर दूसरी, और उसके बाद ही पहली।

जावा में समान नाम और व्यवहार के साथ एक विशेष स्टैक संग्रह वर्ग भी है। ArrayListयह वर्ग और के साथ बहुत सारे व्यवहार साझा करता है LinkedList। लेकिन इसमें ऐसे तरीके भी हैं जो स्टैक व्यवहार को लागू करते हैं:

तरीकों विवरण
T push(T obj)
objतत्व को स्टैक के शीर्ष पर जोड़ता है
T pop()
तत्व को ढेर के ऊपर से लेता है (ढेर की गहराई कम हो जाती है)
T peek()
स्टैक के शीर्ष पर आइटम लौटाता है (स्टैक नहीं बदलता है)
boolean empty()
जाँचता है कि संग्रह खाली है या नहीं
int search(Object obj)
संग्रह में किसी वस्तु की खोज करता है और उसे लौटाता हैindex

उदाहरण:

कोड स्टैक सामग्री (स्टैक का शीर्ष दाईं ओर है)
Stack<Integer> stack = new Stack<Integer>();
stack.push(1);
stack.push(2);
stack.push(3);
int x = stack.pop();
stack.push(4);
int y = stack.peek();
stack.pop();
stack.pop();

[1]
[1, 2]
[1, 2, 3]
[1, 2]
[1, 2, 4]
[1, 2, 4]
[1, 2]
[1]

प्रोग्रामिंग में स्टैक का उपयोग अक्सर किया जाता है। अतः यह एक उपयोगी संग्रह है।



4. अपवाद प्रबंधन के दौरान स्टैक ट्रेस प्रदर्शित करना

विधि कॉल की सूची को स्टैक ट्रेस क्यों कहा जाता है ? क्योंकि यदि आप विधियों की सूची को विधि नामों के साथ कागज की चादरों के ढेर के रूप में सोचते हैं, तो जब आप अगली विधि को कॉल करते हैं, तो आप उस विधि के नाम के साथ एक शीट को ढेर में जोड़ते हैं। और कागज की अगली शीट उसके ऊपर जाती है, और इसी तरह।

जब कोई विधि समाप्त होती है, तो स्टैक के शीर्ष पर स्थित शीट हटा दी जाती है। आप स्टैक के ऊपर की सभी शीटों को हटाए बिना किसी शीट को स्टैक के बीच से नहीं हटा सकते हैं। इसी तरह, आप कॉल की श्रृंखला के बीच में एक विधि को समाप्त नहीं कर सकते हैं, जिसमें सभी विधियों को समाप्त किए बिना कॉल किया गया है।

अपवाद

स्टैक के लिए एक और दिलचस्प उपयोग अपवाद हैंडलिंग के दौरान होता है।

जब किसी प्रोग्राम में कोई त्रुटि होती है और एक अपवाद फेंका जाता है , तो अपवाद में वर्तमान स्टैक ट्रेस होता है - एक सरणी जिसमें विधियों की एक सूची होती है, मुख्य विधि से शुरू होती है और उस विधि के साथ समाप्त होती है जहां त्रुटि हुई थी। यहां तक ​​कि वह रेखा भी है जहां अपवाद फेंका गया था!

यह स्टैक ट्रेस अपवाद के अंदर संग्रहीत है और निम्न विधि का उपयोग करके इसे आसानी से पुनर्प्राप्त किया जा सकता है:StackTraceElement[] getStackTrace()

उदाहरण:

कोड टिप्पणी
try
{
   // An exception may occur here
}
catch(Exception e)
{
   StackTraceElement[] methods = e.getStackTrace()
}




अपवाद को पकड़ें

स्टैक ट्रेस प्राप्त करें जो त्रुटि होने पर मौजूद था।

यह वर्ग का एक तरीका है Throwable, इसलिए इसके सभी वंशजों (यानी सभी अपवादों) के पास यह getStackTrace()तरीका है। सुपर सुविधाजनक, हुह?

अपवाद का स्टैक ट्रेस प्रदर्शित करें

वैसे, Throwableस्टैक ट्रेस के साथ काम करने के लिए क्लास के पास एक और तरीका है, एक ऐसा तरीका जो अपवाद के अंदर संग्रहीत सभी स्टैक ट्रेस जानकारी को प्रदर्शित करता है। इसे कहा जाता है printStackTrace()

काफी आसानी से, आप इसे किसी अपवाद पर कॉल कर सकते हैं।

उदाहरण:

कोड
try
{
   // An exception may occur here
}
catch(Exception e)
{
   e.printStackTrace();
}
कंसोल आउटपुट
java.base/java.lang.Thread.getStackTrace(Thread.java:1606)
Main.test(Main.java:11)
Main.main(Main.java:5)