1. स्टॅक ट्रेस मिळवणे

स्टॅक ट्रेस मिळवत आहे

जावा प्रोग्रामिंग भाषा प्रोग्रामरला प्रोग्राममध्ये काय घडत आहे याबद्दल माहिती मिळविण्याचे अनेक मार्ग प्रदान करते. आणि फक्त शब्द नाही.

उदाहरणार्थ, C++ प्रोग्रॅम्स संकलित केल्यानंतर, ते मशीन कोडने भरलेली एक मोठी फाइल बनतात आणि रनटाइमच्या वेळी प्रोग्रामरला उपलब्ध असलेली सर्व मेमरी ब्लॉकचा पत्ता असतो ज्यामध्ये सध्या कार्यान्वित केलेला मशीन कोड असतो. खूप नाही, म्हणूया.

परंतु Java साठी, प्रोग्रॅम संकलित केल्यानंतरही, वर्ग वर्ग राहतात, पद्धती आणि व्हेरिएबल्स अदृश्य होत नाहीत आणि प्रोग्रामरकडे प्रोग्राममध्ये काय घडत आहे याबद्दल माहिती मिळविण्याचे अनेक मार्ग आहेत.

स्टॅक ट्रेस

उदाहरणार्थ, प्रोग्रामच्या अंमलबजावणीच्या वेळी, आपण सध्या कार्यान्वित होत असलेल्या पद्धतीचा वर्ग आणि नाव शोधू शकता. आणि फक्त एक पद्धत नाही — तुम्ही सध्याच्या पद्धतीपासून पुन्हा पद्धतीपर्यंत कॉलच्या संपूर्ण साखळीबद्दल माहिती मिळवू शकता 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 स्टॅकमध्ये ठेवली, तर तुम्हाला ती उलट क्रमाने मिळवावी लागतील: प्रथम तिसरी शीट, नंतर दुसरी आणि फक्त नंतर पहिली.

Java मध्ये समान नाव आणि वर्तनासह विशेष स्टॅक संग्रह वर्ग आहे. 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)