নাল পয়েন্টার এক্সেপশন - কি এবং কেন হয়?

May 21, 2017

 

নাল পয়েন্টার এক্সেপশন - কি এবং কেন হয়?

- Shafiul Alam Biplob (@facebook/nillbiplob)

 

 আমরা সবাই জানি জাভাতে প্রধানত দুই শ্রেণীর ডাটা টাইপ আছে। প্রিমিটিভ এবং অবজেক্ট/রেফারেন্স টাইপ। প্রিমিটিভ টাইপ যেমন int, double, float etc.

এগুলো লোকাল ভ্যারিয়েবল হিসেবে ব্যবহার করার সময় যদি ভ্যালু এসাইন না করা হয় যেমন তাহলে জাভা কম্পাইলার সাধারণত কম্পাইল টাইম এরর শো করে যেমন 

"/tmp/java_pxLlmh/HelloWorld.java:24: error: variable c might not have been initialized
    System.out.println(c);
                       ^
1 error"

যদিও স্ট্যাটিক অথবা গ্লোবাল ভ্যারিয়েবল এর ক্ষেত্রে ভ্যালু এসাইন না করলেও ডিফল্ট ভাবেই ০ বা ০.০ এসাইন হয়ে যায়।

সুতরাং প্রিমিটিভ টাইপ ডাটা এর ক্ষেত্রে নাল পয়েন্টার এক্সেপশন হবার সুযোগ থাকে না। নিচের স্ক্রিনশটে একটি উদাহরণ দেয়া আছে।

 


 

নাল পয়েন্টার এক্সেপশনটা সাধারণত ঘটে অবজেক্ট/রেফারেন্স টাইপ ডাটা এর ক্ষেত্রে। (নামেই পরিচয়!)

আগের স্ক্রিনশটেই যদি আমরা দেখি, তাহলে দেখবো  OtherClass নামে একটা ক্লাস আছে যেটার একটা মেথড আছে getMessage() নামে। 

এখন আমরা যদি OtherClass এর একটা লোকাল ভ্যারিয়েবল তৈরী করেই OtherClass এর মেথড এক্সেস করার চেষ্টা করি, তাহলে জাভা কম্পাইলার   

  OtherClass myObject;
  System.out.print(myObject.getMessage());

কম্পাইল টাইম এরর শো করবে, এইভাবে "variable myObject might not have been initialized" কারণ আমরা শুধুমাত্র OtherClass ক্লাসের একটি ভ্যারিয়েবল তৈরী করেছি, এটাকে এখনো ইনিশিয়ালাইজ করে অবজেক্ট (ইনস্ট্যান্স) তৈরী করিনি।

প্রিমিটিভ এর মতোই স্ট্যাটিক অথবা গ্লোবাল রেফারেন্স/অবজেক্ট টাইপ ভ্যারিয়েবল এর ক্ষেত্রে ভ্যালু এসাইন না করলেও ডিফল্ট ভাবেই নাল এসাইন হয়ে যায়, মানে স্ট্যাটিক/গ্লোবাল রেফারেন্স/অবজেক্ট টাইপ ভ্যারিয়েবল এর ক্ষেত্রে কম্পাইল টাইম এরর শো করবে না, রানটাইমে নাল পয়েন্টার এক্সেপশন শো করবে।

 

এখন যদি আমরা এইভাবে লিখি 
OtherClass myObject=null;
System.out.print(myObject.getMessage());

তাহলে প্রোগ্রামটা কম্পাইল হবে ঠিকই কিন্তু রান টাইম এক্সেপশন থ্রো করবে কারণ myObject নাম এখনো কোনো OtherClass ক্লাস এর অবজেক্ট তৈরী হয় নাই কিন্তু আমরা সেই ক্লাস এর একটা মেথড কে এক্সেস করার চেষ্টা করছি। 

এটাই নাল পয়েন্টার এক্সেপশন, মানে ক্লাসের অবজেক্টই তৈরী হয় নাই, জাস্ট empty একটা ভ্যারিয়েবল কিন্তু সেই ভ্যারিয়েবল থেকেই আমরা ক্লাসের মেথড কে কল করছি, প্রোগ্রাম তখন কোন ক্লাসের মেথড কে এক্সেস করবে সেটা খুঁজে না পেয়ে রাগের মাথায় প্রোগ্রাম ক্লোজ করে দেয় এবং বলে "নাল পয়েন্টার!"
 


 

ফাইনালি যদি আমরা এইভাবে লিখি 
OtherClass myObject= new OtherClass("I am not null, please print me.");
System.out.print(myObject.getMessage());

তখন myObject নামে OtherClass এর একটি অবজেক্ট/instance তৈরী হবে মেমরিতে, myObject জানবে যে কোন মেথডটাকে কল করতে হবে এবং প্রোগ্রামও ঠান্ডা মাথায় সেই মেথডটিকে এক্সিকিউট করবে!

হ্যাপি জাভা কোডিং! 

সোর্স: 
https://www.tutorialspoint.com/java/java_basic_datatypes.htm
http://stackoverflow.com/questions/1894149/is-null-an-object