1. একটি স্ট্যাক ট্রেস পেয়ে

একটি স্ট্যাক ট্রেস পেয়ে

জাভা প্রোগ্রামিং ভাষা একজন প্রোগ্রামারকে একটি প্রোগ্রামে কী ঘটছে সে সম্পর্কে তথ্য পেতে অনেক উপায় সরবরাহ করে। এবং শুধু শব্দ নয়।

উদাহরণস্বরূপ, C++ প্রোগ্রামগুলি সংকলিত হওয়ার পরে, সেগুলি মেশিন কোডে পূর্ণ একটি বড় ফাইলে পরিণত হয় এবং রানটাইমে প্রোগ্রামারের কাছে যা পাওয়া যায় তা হল মেমরির ব্লকের ঠিকানা যেখানে বর্তমানে চালানো হচ্ছে মেশিন কোড রয়েছে। অনেক কিছু না, বলি।

কিন্তু জাভার জন্য, একটি প্রোগ্রাম সংকলিত হওয়ার পরেও, ক্লাসগুলি ক্লাস থেকে যায়, পদ্ধতি এবং ভেরিয়েবলগুলি অদৃশ্য হয় না এবং প্রোগ্রামারের কাছে প্রোগ্রামে কী ঘটছে সে সম্পর্কে তথ্য পাওয়ার অনেক উপায় রয়েছে।

স্ট্যাক ট্রেস

উদাহরণস্বরূপ, একটি প্রোগ্রামের সঞ্চালনের সময়, আপনি বর্তমানে যে পদ্ধতিটি কার্যকর করা হচ্ছে তার ক্লাস এবং নাম খুঁজে পেতে পারেন। এবং শুধুমাত্র একটি পদ্ধতি নয় - আপনি বর্তমান পদ্ধতি থেকে পদ্ধতিতে ফিরে আসা পদ্ধতি কলের সম্পূর্ণ চেইন সম্পর্কে তথ্য পেতে পারেন 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)