কোনো ভেরিয়েবল যদি কোনো অবজেক্টের রেফারেন্স না রাখে,তাহলে সেই ভেরিয়েবল মূলত একটি নাল রেফারেন্স বা শূণ্য রেফারেন্স ধরে রাখে। সেই ভেরিয়েবল নিয়ে কোনো কাজ করতে চাই, তাহলে জাভা ভার্চুয়াল মেশিন এই এক্সেপশন থ্রো করে। বেশ কয়েকটি জায়গায় এই এক্সেপশন থ্রো হতে পারে। যেমন-
১. একটি ক্লাসের অবজেক্ট তৈরি না করেই সেই ক্লাসের কোনো মেথড করলে। তবে সেই ক্লাসের স্ট্যাটিক মেথড কল করা হলে NullPointerException (NPE) থ্রো হবে না।
২. কোনো ভেরিয়েবলের টাইপ যদি ক্লাস হয় এবং এটি যদি নাল(null) হয়, তাহলে সেই ভেরিয়েবলের কোনো ফ্লিল্ড পরিবর্তন না অ্যাকসেস করতে গেলে NPE থ্রো হবে।
৩. কোনো অ্যারেকে ইনিশিয়ালাইজ না করেই এর লেন্থ কল করা হলে NPE থ্রো হবে।
৪. কোনো এক্সেপশন থ্রো করার সময় throw কিওয়ার্ডের পর new দিয়ে সেই এক্সেপশনের ইনস্ট্যান্স তৈরি করা হয়। যেমন-
তবে throw এর পরে null বসালে অর্থাৎ নিচের স্টেটমেন্টটি NPE থ্রো করবে।
জাভাতে নাল (null) একটি সংরক্ষিত কিওয়ার্ড। একটি ক্লাস থেকে প্রথমে একটি অবজেক্ট তৈরি করা হয়। সেই অবজেক্টকে আমরা রেফারেন্স দিয়ে অ্যাকসেস করতে পারি। যেমন-
এখানে new অপারেটর দিয়ে একটি Person অবজেক্ট তৈরি করা হয়েছে। person1 হচ্ছে সেই অবজেক্টের রেফারেন্স।
এখানে person2 একটি রেফারেন্স। কিন্তু এটি কোনো অবজেক্টকে রেফার করে না।
উপরের person2 একটি নাল (null) বা নাল রেফারেন্স (Null Reference)। এই রেফারেন্স দিয়ে কোনো কাজ করার উপায় নেই। কারণ এর মধ্যে আসলে কিছু নেই। যদি এই রেফারেন্স দিয়ে আমরা কোনো কাজ করতে চাই, তাহলে জাভা ভার্চুয়াল মেশিন NullPointerException থ্রো করবে।
এই এক্সেপশন থেকে বাঁচতে হলে একটি if স্টেটমেন্ট ব্যবহার করে যাচাই করা যেতে পারে যে, রেফারেন্সটি null কিনা।