নালপয়েন্টার এক্সসেপশন কী এবং আমি কীভাবে এটি ঠিক করব?


210

নাল পয়েন্টার ব্যতিক্রমগুলি কী কী ( java.lang.NullPointerException) এবং সেগুলি কী কারণে হয়?

কারণটি নির্ধারণের জন্য কোন পদ্ধতি / সরঞ্জামগুলি ব্যবহার করা যেতে পারে যাতে আপনি ব্যতিক্রমটিকে প্রোগ্রামের অকালমূত সমাপ্ত হতে বাধা দেন?

উত্তর:


3764

আপনি যখন কোনও রেফারেন্স ভেরিয়েবল (অর্থাত্ কোনও বস্তু) ঘোষণা করেন আপনি সত্যই কোনও বস্তুর জন্য পয়েন্টার তৈরি করছেন। নিম্নলিখিত কোডটি বিবেচনা করুন যেখানে আপনি আদিম ধরণের একটি পরিবর্তনশীল ঘোষণা করেন int:

int x;
x = 10;

এই উদাহরণে, ভেরিয়েবলটি xএকটি intএবং জাভা এটি আপনার 0জন্য সূচনা করবে । আপনি যখন 10দ্বিতীয় লাইনে এটির মান নির্ধারণ করেন , তখন আপনার মানটি 10উল্লেখ করা মেমরির স্থানে লেখা হয় x

তবে, আপনি যখন কোনও রেফারেন্স ধরণের ঘোষণার চেষ্টা করবেন তখন ভিন্ন কিছু ঘটে। নিম্নলিখিত কোড নিন:

Integer num;
num = new Integer(10);

প্রথম লাইনটি নামের একটি ভেরিয়েবল ঘোষণা করে num, তবে এটিতে আসলে কোনও আদিম মান থাকে না। পরিবর্তে, এটিতে একটি পয়েন্টার রয়েছে (কারণ টাইপটি Integerযা একটি রেফারেন্স টাইপ)। যেহেতু আপনি এখনও কোনটি নির্দেশ করবেন তা বলেননি, জাভা এটিতে সেট করে null, যার অর্থ " আমি কিছুই দেখছি না "।

দ্বিতীয় লাইনে newকীওয়ার্ডটি কোনও ধরণের অবজেক্ট ইনস্ট্যান্ট করতে (বা তৈরি করতে) ব্যবহৃত হয় Integerএবং পয়েন্টার ভেরিয়েবলটি numসেই Integerবস্তুর জন্য বরাদ্দ করা হয় ।

NullPointerExceptionঘটে যখন আপনি একটি ভেরিয়েবল ডিক্লেয়ার কিন্তু পরিবর্তনশীল (যাকে বলা হয় বিষয়বস্তু ব্যবহার করতে চেষ্টা করার আগে একটি বস্তু এবং পরিবর্তনশীল নির্ধারিত সৃষ্টি করিনি dereferencing )। সুতরাং আপনি এমন কোনও কিছুর দিকে ইঙ্গিত করছেন যা আসলে বিদ্যমান নয়।

.কোনও পদ্ধতি বা ক্ষেত্র অ্যাক্সেস করতে ব্যবহার করার সময় বা [অ্যারে সূচকে ব্যবহার করার সময় সাধারণত ডেরেফারিং হয় ।

যদি আপনি numঅবজেক্টটি তৈরি করার আগে অবহেলা করার চেষ্টা করেন আপনি একটি পাবেন NullPointerException। অতি তুচ্ছ মামলায়, সংকলকটি সমস্যাটি ধরা দেবে এবং আপনাকে তা " num may not have been initialized" "জানাতে দেবে তবে কখনও কখনও আপনি এমন কোড লিখতে পারেন যা সরাসরি অবজেক্টটি তৈরি করে না।

উদাহরণস্বরূপ, আপনার নীচের মতো একটি পদ্ধতি থাকতে পারে:

public void doSomething(SomeObject obj) {
   //do something to obj
}

কোন ক্ষেত্রে, আপনি অবজেক্টটি তৈরি করছেন না obj, বরং ধরে নিচ্ছেন যে doSomething()পদ্ধতিটি বলার আগে এটি তৈরি করা হয়েছিল। দ্রষ্টব্য, পদ্ধতিটি এভাবে কল করা সম্ভব:

doSomething(null);

যে ক্ষেত্রে, objহয় null। যদি পদ্ধতিটি পাস-ইন করা অবজেক্টটিতে কিছু করার উদ্দেশ্যে থাকে তবে এটি ফেলে দেওয়া উপযুক্ত NullPointerExceptionকারণ এটি একটি প্রোগ্রামার ত্রুটি এবং ডিবাগিংয়ের উদ্দেশ্যে প্রোগ্রামারের সেই তথ্যের প্রয়োজন হবে। দয়া করে ব্যতিক্রম বার্তায় অবজেক্ট ভেরিয়েবলের নাম অন্তর্ভুক্ত করুন

Objects.requireNonNull(a, "a");

বিকল্পভাবে, এমন কিছু ক্ষেত্রে থাকতে পারে যেখানে পদ্ধতির উদ্দেশ্য কেবলমাত্র বস্তুতে পাস করা পরিচালনা করা নয়, এবং তাই নাল প্যারামিটার গ্রহণযোগ্য হতে পারে। এই ক্ষেত্রে, আপনার নাল প্যারামিটারটি পরীক্ষা করা এবং অন্যরকম আচরণ করা দরকার। আপনার ডকুমেন্টেশনে এটিও ব্যাখ্যা করা উচিত। উদাহরণস্বরূপ, doSomething()লিখিত হতে পারে:

/**
  * @param obj An optional foo for ____. May be null, in which case 
  *  the result will be ____.
  */
public void doSomething(SomeObject obj) {
    if(obj == null) {
       //do something
    } else {
       //do something else
    }
}

অবশেষে, স্ট্যাক ট্রেস ব্যবহার করে কীভাবে ব্যতিক্রমটি নির্দিষ্ট করা যায় cause

কারণটি নির্ধারণের জন্য কোন পদ্ধতি / সরঞ্জামগুলি ব্যবহার করা যেতে পারে যাতে আপনি ব্যতিক্রমটিকে প্রোগ্রামের অকালমূত সমাপ্ত হতে বাধা দেন?

সন্ধানকারী সোনার এনপিই সনাক্ত করতে পারে। সোনার জেভিএম ডায়নামিকালি কারণে নাল পয়েন্টার ব্যতিক্রম ধরতে পারে


558
"এই ধরণের ব্যতিক্রম এড়ানোর সর্বোত্তম উপায় হ'ল আপনি যখন বস্তুটি নিজে তৈরি করেন নি তখন সর্বদা নাল পরীক্ষা করা" " যদি কলার নাল পাস করে তবে নাল পদ্ধতিটির পক্ষে একটি কার্যকর যুক্তি না হয়, তবে ব্যতিক্রমটিকে কলারের কাছে ফিরিয়ে দেওয়া সঠিক কারণ এটি কলারের দোষ। নিঃশব্দে অবৈধ ইনপুট উপেক্ষা করা এবং পদ্ধতিতে কিছুই না করা অত্যন্ত দুর্বল পরামর্শ কারণ এটি সমস্যাটি আড়াল করে।
বোয়ান

104
আমি এই পোস্টটি সম্পর্কে একটি মন্তব্য যুক্ত করব যাতে ব্যাখ্যা করা যায় যে এমনকি অটোবক্সিং ব্যবহার করার সময় আদিমদের ক্ষেত্রেও নিয়োগগুলি এনপিইগুলিকে সৃষ্টি করতে পারে: int a=bখ যদি একটি হয় তবে এনপিই নিক্ষেপ করতে পারে Integer। এমন কেস রয়েছে যেখানে এটি ডিবাগ করতে বিভ্রান্ত করছে।
সাইমন ফিশার

58
ওয়েব ব্রাউজার থেকে কোনও ওয়েব অ্যাপের মাধ্যমে ছুঁড়ে দেওয়া এনপিই কি ক্যাপচার করা সম্ভব? এটি ওয়েব ব্রাউজার থেকে পৃষ্ঠার উত্সে প্রদর্শিত হবে ..
সিড

76
হ্যাঁ আপনি যদি কোনও পদ্ধতিতে ডাকার আগে অবজেক্টটি নালার সমান হয় বা এটির কোনও ভেরিয়েবল অ্যাক্সেস করার চেষ্টা করেন কিনা তা পরীক্ষা করে দেখুন। আপনার কোডটি কাঠামোগত কিছু সময় নাল পয়েন্টার ব্যতিক্রম এড়াতে সহায়তা করতে পারে। উদাহরণস্বরূপ, যখন কোনও ইনপুট স্ট্রিংটি একটি ধ্রুব স্ট্রিংয়ের সাথে পরীক্ষা করা হয় আপনি এখানে যেমন ধ্রুব স্ট্রিং দিয়ে শুরু করতে পারেন: যদি ("সোমারস্ট্রিং" .সম্পাদনা (ইনপুটস্ট্রিং)) {} // এমনকি ইনপুটস্ট্রিং নাল হয় তবে তার ব্যতিক্রম ছুঁড়ে না দেওয়া হয়। তাই সুরক্ষিত থাকার চেষ্টা করার জন্য এমন অনেকগুলি জিনিস রয়েছে যা আপনি করতে পারেন।
রোজ

78
NullPointerExceptionআপনার কোডে সমস্যা এড়ানো একটি অতিরিক্ত উপায় হ'ল ব্যবহার @Nullableএবং @NotNullটীকাগুলি। নিম্নলিখিত উত্তরটিতে এ সম্পর্কে আরও তথ্য রয়েছে। যদিও এই উত্তরটি ইন্টেলিজ আইডিই সম্পর্কে সুনির্দিষ্টভাবে রয়েছে তবে এটি অন্যান্য সরঞ্জামগুলিতেও প্রযোজ্য যেমনটি তেহ মন্তব্য থেকে পাওয়া যায়। (বিটিডব্লিউ আমাকে সরাসরি এই উত্তরটি সম্পাদনা করার অনুমতি দেওয়া হচ্ছে না, সম্ভবত লেখক এটি যোগ করতে পারেন?)
আরজান মেলস

879

NullPointerExceptionগুলি হ'ল ব্যতিক্রমগুলি হয় যখন আপনি কোনও রেফারেন্স ব্যবহার করার চেষ্টা করেন যা মেমোরিতে কোনও অবস্থান নির্দেশ করে না (নাল) যেন এটি কোনও অবজেক্টকে রেফারেন্স করছে। নাল রেফারেন্সে কোনও পদ্ধতিতে কল করা বা নাল রেফারেন্সের ক্ষেত্রটি অ্যাক্সেস করার চেষ্টা করলে a NullPointerException। এগুলি সর্বাধিক সাধারণ, তবে অন্যান্য উপায়গুলি NullPointerExceptionজাভাদোক পৃষ্ঠায় তালিকাভুক্ত রয়েছে ।

সম্ভবত আমি দ্রুততম উদাহরণ কোডটি নিয়ে আসতে পারি যার একটি চিত্রিত করার জন্য NullPointerExceptionএটি হতে পারে:

public class Example {

    public static void main(String[] args) {
        Object obj = null;
        obj.hashCode();
    }

}

প্রথম লাইনে main, আমি স্পষ্টতই Objectরেফারেন্সটির objসমান করে দিচ্ছি null। এর অর্থ আমার কাছে একটি রেফারেন্স রয়েছে তবে এটি কোনও বস্তুর দিকে নির্দেশ করছে না। এরপরে, আমি রেফারেন্সটি এমনভাবে আচরণ করার চেষ্টা করব যদিও এটি কোনও পদ্ধতিতে কল করে কোনও বস্তুর দিকে নির্দেশ করে। ফলাফলটি NullPointerExceptionকারণ হিসাবে উল্লেখ করা হচ্ছে যে স্থানে কার্যকর করার জন্য কোনও কোড নেই।

(এটি প্রযুক্তিগত, তবে আমি মনে করি এটি উল্লেখ করা যায়: একটি রেফারেন্স যা নালকে নির্দেশ করে এটি কোনও সি পয়েন্টার হিসাবে একই নয় যা একটি অবৈধ মেমরি অবস্থানের দিকে নির্দেশ করে A এমন কোনও অবস্থানের দিকে নির্দেশ করা যা অবৈধ বলে মনে হয়))


49
আপনি সেখানে যা লিখেছিলেন তা আমি বুঝতে পেরেছি, তবে কেবলমাত্র আমি কিছু সময়ের জন্য কোডিং করছি এবং একটি 'পয়েন্টার' এবং 'রেফারেন্স' কী (এবং সেই বিষয়ে নাল কী) তা আমি জানি। আমি যখন ঠিক এর মতো ব্যাখ্যাগুলিতে ডুব দেওয়ার চেষ্টা করি, তখন আমার ছাত্ররা আমার দিকে ক্রস করা দেখায়, কারণ পর্যাপ্ত ব্যাকগ্রাউন্ড নেই।
এমএমআর

33
@ মিমার: প্রতিক্রিয়াটির জন্য ধন্যবাদ, আপনি একটি বৈধ পয়েন্ট করেছেন। ইন্টারনেটে সত্যই বিচার করা কঠিন যে কেউ কোথায় আছেন, এবং কোন স্তরে ব্যাখ্যা শুরু করা নিরাপদ। আমি এটি আবার সংশোধন করার চেষ্টা করব।
বিল

22
আরো সাধারণ উপায় অনুশীলন একটি নালপয়েন্টারএক্সেপশন পেতে স্পষ্টভাবে ব্যতীত অন্য কিছু সদস্য পরিবর্তনশীল আরম্ভ করতে বিস্মরণ হবে nullএটি ব্যবহার, আগে ভালো । স্থানীয় ভেরিয়েবলের সাথে, সংকলকটি এই ত্রুটিটি ধরবে, তবে এই ক্ষেত্রে তা হয় না। সম্ভবত এটি আপনার উত্তরের একটি দরকারী সংযোজন করতে পারে?
ইলমারি করোনেন

6
@ এজেপি আমি আপনার পয়েন্টগুলি বৈধ বলে মনে করি, তাই আমি উত্তরটি আরও পরিষ্কার করে এবং 'পয়েন্ট টু নাল' বলতে এড়াতে যেখানে আপডেট করেছি তা আপডেট করেছি।
স্টিভ পাওয়েল

5
@ স্টিভপোয়েল আমি দীর্ঘদিন আগে ইঙ্গিত দিয়েছিলাম যে আমার উত্তরটি পরিবর্তন করতে চাই না। দয়া করে মূল লেখকের উদ্দেশ্যকে সম্মান করুন।
বিল করুন

696

নালপয়েন্টার এক্সসেপশন কী?

শুরু করার জন্য একটি ভাল জায়গা হ'ল জাভাডকস । তারা এটি আবৃত:

যখন কোনও অ্যাপ্লিকেশন কোনও ক্ষেত্রে প্রয়োজন পড়ার ক্ষেত্রে নাল ব্যবহার করার চেষ্টা করে তখন ছুড়ে দেওয়া হয়। এর মধ্যে রয়েছে:

  • নাল বস্তুর উদাহরণ পদ্ধতিতে কল করা।
  • নাল বস্তুর ক্ষেত্র অ্যাক্সেস বা সংশোধন করা।
  • নাল দৈর্ঘ্য গ্রহণ যেমন এটি একটি অ্যারে হয়।
  • নলের স্লটগুলিতে অ্যাক্সেস বা সংশোধন করা যেন এটি একটি অ্যারে।
  • নাল নিক্ষেপ করা যেন এটি একটি থ্রোয়েবল মান।

নাল অবজেক্টের অন্যান্য অবৈধ ব্যবহারগুলি নির্দেশ করতে অ্যাপ্লিকেশনগুলিকে এই শ্রেণীর উদাহরণগুলি নিক্ষেপ করা উচিত।

এটি এমনও হয় যে আপনি জেএলএস অনুসারে যদি কোনও নাল রেফারেন্স ব্যবহার করার চেষ্টা করেন synchronized, তবে এটিও এই ব্যতিক্রমটিকে ছুঁড়ে ফেলবে :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • অন্যথায়, এক্সপ্রেশনটির মান যদি নাল হয় তবে একটি NullPointerExceptionনিক্ষেপ করা হয়।

আমি কীভাবে এটি ঠিক করব?

সুতরাং আপনি একটি আছে NullPointerException। আপনি কিভাবে এটি ঠিক করবেন? আসুন একটি সাধারণ উদাহরণ যা একটি ছুড়ে NullPointerException:

public class Printer {
    private String name;

    public void setName(String name) {
        this.name = name;
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer();
        printer.print();
    }
}

নাল মানগুলি শনাক্ত করুন

প্রথম পদক্ষেপটি সঠিকভাবে কোন মানগুলি ব্যতিক্রম ঘটায় তা চিহ্নিত করছে । এর জন্য আমাদের কিছু ডিবাগিং করা দরকার। স্ট্যাকট্রেস পড়া শিখতে জরুরী । এটি আপনাকে দেখাবে যে ব্যতিক্রমটি কোথায় ছুঁড়েছিল:

Exception in thread "main" java.lang.NullPointerException
    at Printer.printString(Printer.java:13)
    at Printer.print(Printer.java:9)
    at Printer.main(Printer.java:19)

এখানে, আমরা দেখতে পাচ্ছি যে ব্যতিক্রমটি 13 লাইনে ফেলে দেওয়া হয়েছে ( printStringপদ্ধতিতে)। লাইনটি দেখুন এবং লগিং স্টেটমেন্ট যুক্ত করে বা একটি ডিবাগার ব্যবহার করে কোন মানগুলি বাতিল হয় তা পরীক্ষা করুন । আমরা এটি sনাল, এবং lengthএটিতে পদ্ধতিটি কল করা ব্যতিক্রম ছোঁড়ে find আমরা দেখতে পাচ্ছি যে s.length()পদ্ধতিটি অপসারণের পরে প্রোগ্রামটি ব্যতিক্রম ছোঁড়া বন্ধ করে দেয় ।

এই মানগুলি কোথা থেকে এসেছে তা সন্ধান করুন

এই মানটি কোথা থেকে আসে তা পরবর্তী পরীক্ষা করুন। পদ্ধতির কলারের নিম্নলিখিত মাধ্যমে আমরা দেখতে যে sদিয়ে পাস করা হয়েছে printString(name)print()পদ্ধতি, এবং this.nameনাল হয়।

এই মানগুলি কোথায় সেট করা উচিত তা চিহ্নিত করুন

কোথায় this.nameসেট করা হয়? ইন setName(String)পদ্ধতি। আরও কিছু ডিবাগিংয়ের সাথে আমরা দেখতে পাচ্ছি যে এই পদ্ধতিটি মোটেই কল করা হয়নি। তাহলে পদ্ধতি বলা হয়, চেক করতে ভুলবেন না অর্ডার যে এই পদ্ধতি বলা হয়, এবং সেট পদ্ধতি বলা হয় না পরে মুদ্রণ পদ্ধতি।

আমাদের সমাধান দেওয়ার জন্য এটি যথেষ্ট: কল করার printer.setName()আগে একটি কল যুক্ত করুন printer.print()

অন্যান্য সংশোধন

ভেরিয়েবলের একটি ডিফল্ট মানsetName থাকতে পারে (এবং এটি নালায় সেট হয়ে যাওয়া রোধ করতে পারে):

private String name = "";

হয় printবা printStringপদ্ধতি নাল পরীক্ষা করতে পারে উদাহরণস্বরূপ:

printString((name == null) ? "" : name);

অথবা আপনি ক্লাসটি ডিজাইন করতে পারেন যাতে name সর্বদা একটি নন-মান থাকে :

public class Printer {
    private final String name;

    public Printer(String name) {
        this.name = Objects.requireNonNull(name);
    }

    public void print() {
        printString(name);
    }

    private void printString(String s) {
        System.out.println(s + " (" + s.length() + ")");
    }

    public static void main(String[] args) {
        Printer printer = new Printer("123");
        printer.print();
    }
}

আরো দেখুন:

আমি এখনও সমস্যাটি খুঁজে পাচ্ছি না

যদি আপনি সমস্যাটি ডিবাগ করার চেষ্টা করেন এবং এখনও সমাধান না পান তবে আপনি আরও সাহায্যের জন্য একটি প্রশ্ন পোস্ট করতে পারেন, তবে আপনি এখন পর্যন্ত যা চেষ্টা করেছেন তা অন্তর্ভুক্ত করার বিষয়টি নিশ্চিত করুন। সর্বনিম্ন, প্রশ্নের স্ট্যাকট্রেস অন্তর্ভুক্ত করুন এবং কোডটিতে গুরুত্বপূর্ণ লাইন নম্বরগুলি চিহ্নিত করুন । এছাড়াও, প্রথমে কোডটি সরল করার চেষ্টা করুন ( এসএসসিসিই দেখুন )।


44
+1 স্ট্যাকট্র্যাসের মধ্য দিয়ে যাওয়া সহ একটি উদাহরণ থাকা ভাল; এটি এনপিই ডিবাগ করার জন্য কেন এটি গুরুত্বপূর্ণ তা দেখাতে গুরুত্বপূর্ণ। (এবং কেউ যখন কোনও ত্রুটি সম্পর্কে কোনও প্রশ্ন পোস্ট করেন তখন আমরা কেন প্রায় সর্বদা স্ট্যাকট্র্যাসের সন্ধান করি)
ডেনিস মেনগ

16
আপনি ডিবাগিংয়ের কথা উল্লেখ করেছেন ... কীভাবে এটি কাজ করে? আমি কিছুক্ষণের জন্য এই বিষয়টি নিয়ে গবেষণা করছি, কিন্তু কিছুই খুঁজে পাচ্ছি না। আমি নিশ্চিত যে আপনার মত একজন আধ্যাত্মিক শিক্ষক এটি আমাকে একটি সেকেন্ডে শিখিয়ে দিতে পারবেন! অনেক ধন্যবাদ! :-)
রুচির বড়োনিয়া

15
@ রুচিরবারোনিয়া একটি ডিবাগার আপনাকে কোন পদ্ধতিতে ডাকা হয় এবং কীভাবে ভেরিয়েবল পরিবর্তন করা হয় তা দেখার জন্য আপনাকে লাইন দ্বারা একটি প্রোগ্রাম লাইনে পা রাখার অনুমতি দেয়। আইডিইগুলির কাছে এটি করার জন্য কিছু সরঞ্জাম থাকা উচিত। উদাহরণস্বরূপ vogella.com / টিউটোরিয়ালস / ক্লিপসডিবগিং / আর্টিকেলHtml দেখুন ।
fgb

15
@ রুচিরবারোনিয়া আপনি স্ট্যাকট্রেসে যেমন কোনও নলপয়েন্টারএক্সেপশনগুলির চারপাশের পদ্ধতিগুলির জন্য ব্রেকপয়েন্ট স্থাপন করেছেন এবং ভেরিয়েবলের মানগুলি যা প্রত্যাশা করেছেন তার বিপরীতে যাচাই করে নিন। আপনি যদি জানেন যে কোনও ভেরিয়েবলটি শূন্য হওয়া উচিত নয় যখন এটি হওয়া উচিত নয়, তবে আপনি কোনও কোডের চারপাশে ব্রেকপয়েন্ট সেট করতে পারেন যা মান পরিবর্তন করে। এছাড়াও আপনি ব্যবহার করতে পারেন শর্তাধীন ব্রেকপয়েন্টস যা কোনও মান পরিবর্তন হওয়ার পরে আপনাকে জানায়।
fgb

6
স্ট্রিং অবজেক্টকে একটি খালি স্ট্রিংয়ে তাদের ডিফল্ট মান হিসাবে সেট করা একটি দুর্বল অনুশীলন হিসাবে বিবেচনা করা হয়।
ক্ষুদ্র

501

প্রশ্ন: একটি NullPointerException(এনপিই) এর কারণ কী ?

আপনার যা জানা উচিত যে, জাভা ধরনের বিভক্ত আদিম ধরনের ( boolean,int , ইত্যাদি) এবং রেফারেন্স ধরনের । জাভাতে রেফারেন্সের ধরণগুলি আপনাকে বিশেষ মানটি ব্যবহার করার অনুমতি দেয় nullযা জাভা "কোনও বস্তু নয়" বলার উপায়।

একজন NullPointerException যখনই আপনার প্রোগ্রাম প্রচেষ্টা ব্যবহার করতে রানটাইম নিক্ষিপ্ত হয় nullযেমন যদি এটা একটি বাস্তব রেফারেন্স ছিল। উদাহরণস্বরূপ, আপনি যদি এটি লিখেন:

public class Test {
    public static void main(String[] args) {
        String foo = null;
        int length = foo.length();   // HERE
    }
}

"এখানে" লেবেলযুক্ত বিবৃতিটি চালানোর চেষ্টা করতে চলেছে length() একটি nullরেফারেন্সে পদ্ধতিটি এটি একটি নিক্ষেপ করবে NullPointerException

এমন অনেকগুলি উপায় রয়েছে যা আপনি কোনও nullমান ব্যবহার করতে পারেন যা এর ফলাফল হিসাবে আসে NullPointerException। আসলে, একমাত্র জিনিস যা আপনি পারেনnull এনপিইর কারণ ছাড়াই তা হ'ল:

  • এটিকে একটি রেফারেন্স ভেরিয়েবলে নিয়োগ করুন বা এটি একটি রেফারেন্স ভেরিয়েবল থেকে পড়ুন,
  • এটিকে একটি অ্যারে উপাদানকে বরাদ্দ করুন বা অ্যারে উপাদান থেকে এটি পড়ুন (শর্তাবলী যে অ্যারে রেফারেন্স নিজেই নাল!),
  • এটি একটি প্যারামিটার হিসাবে পাস বা ফলাফল হিসাবে এটি ফিরে, বা
  • এটি ==বা !=অপারেটরগুলি ব্যবহার করে পরীক্ষা করুন , বা instanceof

প্রশ্ন: আমি কীভাবে এনপিই স্ট্যাকট্রেস পড়ব?

মনে করুন যে আমি উপরের প্রোগ্রামটি সংকলন এবং চালনা করছি:

$ javac Test.java 
$ java Test
Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:4)
$

প্রথম পর্যবেক্ষণ: সংকলন সফল! প্রোগ্রামটিতে সমস্যাটি কোনও সংকলন ত্রুটি নয়। এটি একটি রানটাইম ত্রুটি। (কিছু আইডিই সতর্ক করতে পারে আপনার প্রোগ্রামটি সর্বদা একটি ব্যতিক্রম ছুঁড়ে ফেলবে ... তবে মানক javacসংকলক তা দেয় না))

দ্বিতীয় পর্যবেক্ষণ: আমি যখন প্রোগ্রামটি চালাচ্ছি, এটি "গাবলডি-গুক" এর দুটি লাইন আউটপুট করে। ভুল !! এটা গাব্বলডি-গুক না। এটি একটি স্ট্যাকট্রেস ... এবং এটি গুরুত্বপূর্ণ তথ্য সরবরাহ করে যা আপনি যদি আপনার মনোযোগ দিয়ে পড়ার জন্য সময় নেন তবে আপনার কোডের ত্রুটিটি সন্ধান করতে সহায়তা করবে।

সুতরাং আসুন এটি কি দেখুন:

Exception in thread "main" java.lang.NullPointerException

স্ট্যাক ট্রেসের প্রথম লাইন আপনাকে বেশ কয়েকটি জিনিস বলে:

  • এটি আপনাকে জাভা থ্রেডের নাম জানায় যেখানে ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছিল। একটি থ্রেড সহ একটি সাধারণ প্রোগ্রামের জন্য (এটির মতো) এটি "মূল" হবে। চল এগোই ...
  • এটি আপনাকে ফেলে দেওয়া ব্যতিক্রমের পুরো নামটি বলে; অর্থাত java.lang.NullPointerException
  • যদি ব্যতিক্রমটির সাথে সম্পর্কিত ত্রুটি বার্তা থাকে তবে তা ব্যতিক্রম নামের পরে আউটপুট হবে। NullPointerExceptionএই ক্ষেত্রে অস্বাভাবিক, কারণ এটিতে খুব কমই একটি ত্রুটির বার্তা রয়েছে।

দ্বিতীয় লাইনটি এনপিই নির্ণয়ের ক্ষেত্রে সবচেয়ে গুরুত্বপূর্ণ।

at Test.main(Test.java:4)

এটি আমাদের বেশ কয়েকটি বিষয় বলে:

  • "at Test.main" বলে যে আমরা mainপদ্ধতিতে ছিলামTest ক্লাসের ।
  • "Test.java:4:4" ক্লাসের উত্স ফাইলের নাম দেয় এবং এটি আমাদের জানায় যে এটি যেখানে ঘটেছিল বিবৃতিটি ফাইলের লাইন 4-এ রয়েছে।

আপনি যদি উপরের ফাইলে লাইনগুলি গণনা করেন তবে লাইন 4 হ'ল আমি এখানে "এখানে" মন্তব্য দিয়ে লেবেল করেছি।

মনে রাখবেন যে আরও জটিল উদাহরণে এনপিই স্ট্যাক ট্রেসটিতে প্রচুর লাইন থাকবে। তবে আপনি নিশ্চিত হতে পারেন যে দ্বিতীয় লাইনটি (প্রথম "at" লাইন) আপনাকে জানিয়ে দেবে যে এনপিই কোথায় 1 ছুঁড়েছিল ।

সংক্ষেপে, স্ট্যাক ট্রেস আমাদের দ্ব্যর্থহীনভাবে বলবে যে প্রোগ্রামটির কোন বিবৃতিটি এনপিইকে ফেলেছে।

1 - বেশ সত্য নয়। নেস্টেড ব্যতিক্রম বলে কিছু জিনিস আছে ...

প্রশ্ন: আমি কীভাবে আমার কোডটিতে এনপিই ব্যতিক্রমের কারণটি সন্ধান করব?

এটি কঠিন অংশ। সংক্ষিপ্ত উত্তর হ'ল স্ট্যাক ট্রেস, উত্স কোড এবং প্রাসঙ্গিক এপিআই ডকুমেন্টেশন দ্বারা সরবরাহিত প্রমাণগুলিতে যৌক্তিক অনুক্রম প্রয়োগ করা।

প্রথমে সরল উদাহরণ (উপরে) দিয়ে চিত্রিত করা যাক। স্ট্যাক ট্রেস আমাদের জানিয়েছে যে রেখাটি দেখে আমরা শুরু করি যেখানে এনপিই ঘটেছিল:

int length = foo.length(); // HERE

কীভাবে এটি একটি এনপিই ফেলতে পারে?

আসলে, কেবল একটি উপায় আছে: যদি fooমান হয় তবেই তা ঘটতে পারে null। তারপরে আমরা length()পদ্ধতিটি চালানোর চেষ্টা করি null... ব্যাং!

কিন্তু (আমি আপনাকে বলতে শুনেছি) যদি length()পদ্ধতি কলের ভিতরে এনপিই ফেলে দেওয়া হয় তবে কী হবে?

ঠিক আছে, যদি এটি ঘটে থাকে তবে স্ট্যাকের ট্রেসটি অন্যরকম দেখাবে। প্রথম "এট" লাইনটি বলবে যে ব্যতিক্রমটি java.lang.Stringক্লাসের কোনও লাইনে নিক্ষেপ করা হয়েছিল এবং 4 এর লাইনটি Test.javaদ্বিতীয় "at" লাইনে থাকবে।

তাহলে nullকোথা থেকে এলো? এই ক্ষেত্রে এটি সুস্পষ্ট এবং এটি সংশোধন করার জন্য আমাদের কী করা উচিত তা স্পষ্ট। (একটি নন-নাল মান নির্ধারণ করুন foo))

ঠিক আছে, সুতরাং আরও কিছু জটিল উদাহরণ চেষ্টা করুন। এর জন্য কিছুটা যৌক্তিক ছাড়ের প্রয়োজন হবে ।

public class Test {

    private static String[] foo = new String[2];

    private static int test(String[] bar, int pos) {
        return bar[pos].length();
    }

    public static void main(String[] args) {
        int length = test(foo, 1);
    }
}

$ javac Test.java 
$ java Test
Exception in thread "main" java.lang.NullPointerException
    at Test.test(Test.java:6)
    at Test.main(Test.java:10)
$ 

সুতরাং এখন আমাদের দুটি "at" লাইন রয়েছে। প্রথমটি এই লাইনের জন্য:

return args[pos].length();

এবং দ্বিতীয়টি এই লাইনের জন্য:

int length = test(foo, 1);

প্রথম লাইনে তাকিয়ে, কীভাবে এটি একটি এনপিই ফেলতে পারে? দুটি উপায় আছে:

  • এর মান যদি barহয় nullতবে bar[pos]একটি এনপিই নিক্ষেপ করবে।
  • এর মান bar[pos]যদি nullএরপরে কল length()করা হয় তবে এটি একটি এনপিই নিক্ষেপ করবে।

এরপরে, আমাদের সেই চিত্রগুলির মধ্যে কোনটি আসলে কী ঘটছে তা ব্যাখ্যা করে explains আমরা প্রথমটি অন্বেষণ করে শুরু করব:

কোথা barথেকে আসে? এটি testমেথড কলের একটি প্যারামিটার এবং যদি আমরা কীভাবে testডাকা হত তা খতিয়ে দেখি তবে আমরা দেখতে পারি যে এটি fooস্ট্যাটিক ভেরিয়েবল থেকে এসেছে । তদতিরিক্ত, আমরা স্পষ্ট দেখতে পাচ্ছি যে আমরা fooএকটি নন-মানকে সূচনা করেছি । এই ব্যাখ্যাটি সাময়িকভাবে বরখাস্ত করার পক্ষে যথেষ্ট। (তত্ত্বগতভাবে, অন্য কিছুতে পরিবর্তিত হতে fooপারেnull ... তবে এখানে এটি ঘটছে না))

তাহলে আমাদের দ্বিতীয় দৃশ্যের কী হবে? ভাল, আমরা দেখতে পারেন posহয় 1, তাই তার মানে তাদের foo[1]হতে হবে null। এটা কি সম্ভব?

অবশ্যই এটা! এবং এটাই সমস্যা. যখন আমরা এটির মতো সূচনা করি:

private static String[] foo = new String[2];

আমরা String[]দুটি উপাদান যা একটিতে শুরু করা হয় তাnull বরাদ্দ করি । এরপরে, আমরা foo... এর বিষয়বস্তুগুলি পরিবর্তন করি নি foo[1]এখনও থাকবে null


425

এটি এমন যে আপনি কোনও বস্তুর অ্যাক্সেস করার চেষ্টা করছেন null। নীচে উদাহরণ বিবেচনা করুন:

TypeA objA;

এই মুহুর্তে আপনি এই বিষয়টিকে সবেমাত্র ঘোষণা করেছেন তবে আরম্ভ বা তাত্ক্ষণিক নয় । এবং যখনই আপনি এর মধ্যে কোনও সম্পত্তি বা পদ্ধতি অ্যাক্সেস করার চেষ্টা করবেন তখন তা ছুঁড়ে যাবে NullPointerExceptionযা বোঝা যায়।

নীচের উদাহরণটিও দেখুন:

String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown

1
যদি আমরা System.out.println (a.leth ()) দিই; // নালপয়েন্টারএক্সেপশন নিক্ষেপ করা হবে, এড়াতে আমরা ট্রাই ক্যাচ ব্লক দিয়ে পরিচালনা করতে পারি। আপনাকে ধন্যবাদ
বিজয়া ভার্মা ল্যাঙ্কে

359

কোনও অ্যাপ্লিকেশন প্রয়োজনীয় ক্ষেত্রে কোনও অ্যাপ্লিকেশন নাল ব্যবহার করার চেষ্টা করার সময় একটি নাল পয়েন্টার ব্যতিক্রম নিক্ষেপ করা হয়। এর মধ্যে রয়েছে:

  1. কোনও nullবস্তুর উদাহরণ পদ্ধতি কল করা Call
  2. কোনও nullঅবজেক্টের ক্ষেত্র অ্যাক্সেস বা সংশোধন করা ।
  3. দৈর্ঘ্য গ্রহণ করে nullযেন এটি একটি অ্যারে হয়।
  4. স্লটগুলিতে অ্যাক্সেস বা সংশোধন nullকরা যেন এটি একটি অ্যারে।
  5. নিক্ষেপ nullকরা যেন এটি একটি হ্রাসযোগ্য মান।

অ্যাপ্লিকেশনগুলির অন্যান্য অবৈধ ব্যবহারগুলি নির্দেশ করতে এই শ্রেণীর উদাহরণগুলি নিক্ষেপ করা উচিত null অবজেক্টের ।

তথ্যসূত্র: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html


12
এটি সরল রাখুন, আমি এই উত্তরটি পছন্দ করি, আপনি যদি সঠিক বিবেচনা করেন তবে এটি যুক্ত করুন - কোনও বস্তুর অবিচ্ছিন্ন বৈশিষ্ট্যে অ্যাক্সেস
এমিলিয়ানো

5
@ এমিলিয়ানো - কেবল একটি প্রাথমিক বৈশিষ্ট্য অ্যাক্সেস করা কোনও এনপিইর কারণ নয়। আপনি << <<<<<<<<<<<<<<<<<<<<<<<< = the
স্টিফেন সি

1
আপনি যদি আরও কেস চান: ১) nullএকটি synchronizedব্লকের nullলক্ষ্য হিসাবে ব্যবহার করে, ২) এটিকে লক্ষ্য হিসাবে ব্যবহার করে switchএবং আনবক্সিং করতে null
স্টিফেন সি

333

একটি nullপয়েন্টার এক কোথাও না যে পয়েন্ট। যখন আপনি একটি পয়েন্টার ডি-রেফারেন্স p, আপনি বলতে পি "আমার অবস্থান সঞ্চিত ডেটা দিতে" "। যখন pএকটি হল nullপয়েন্টার, অবস্থান সঞ্চিত pহয় nowhere, আপনি বলছে" 'কোথাও না' অবস্থানে আমার ডেটা দিতে "। স্পষ্টতই, এটি এটি করতে পারে না, তাই এটি একটি নিক্ষেপ করেnull pointer exception

সাধারণভাবে, কারণ কিছু সঠিকভাবে শুরু হয়নি।


2
আমরা কি একটি ডাটাবেস তৈরি করছি? -> জাভা NULLহিসাবে লেখা হয় null। এবং এটি একটি কেস সংবেদনশীল জিনিস।
বিভিডিবি

3
"একটি নাল পয়েন্টার এমনটি যা কোথাও নির্দেশ করে" আমি অসম্মতি জানাই। নাল পয়েন্টারগুলি কোথাও নির্দেশ করে না, তারা নাল মানগুলিতে নির্দেশ করে।
TheRealChx101

2
@ TheRealChx101 একটি নাল পয়েন্টার এবং একটি নাল মান একটি পয়েন্টার বিভিন্ন জিনিস - একটি নাল পয়েন্টার নাল মান নির্দেশ করে না। ধরুন আপনার পয়েন্টারটিতে একটি পয়েন্টার রয়েছে: পয়েন্টারটি পয়েন্টার বিতে একটি পয়েন্টার, এবং পয়েন্টার বি নাল is এই ক্ষেত্রে, পয়েন্টার এ একটি নাল মানকে নির্দেশ করে এবং পয়েন্টার বি একটি নাল পয়েন্টার।
মিঃজেব্রা

321

এটি কীভাবে হয় এবং কীভাবে এটি ঠিক করা যায় তার ব্যাখ্যা দেওয়ার জন্য ইতিমধ্যে প্রচুর ব্যাখ্যা উপস্থিত রয়েছে, তবে এগুলি এড়ানোর জন্য আপনার সর্বোত্তম অভ্যাসগুলিও অনুসরণ করা উচিত NullPointerException

আরও দেখুন: সেরা অনুশীলনের একটি ভাল তালিকা

আমি finalসংশোধনকারীটির একটি ভাল ব্যবহার করব, খুব গুরুত্বপূর্ণ । জাভাতে যখনই প্রযোজ্য "চূড়ান্ত" সংশোধক ব্যবহার করুন

সারসংক্ষেপ:

  1. ব্যবহার finalভাল আরম্ভের প্রয়োগ সংশোধক ।
  2. পদ্ধতিগুলিতে নাল ফিরে আসা এড়াবেন, উদাহরণস্বরূপ প্রযোজ্য ক্ষেত্রে খালি সংগ্রহ ফিরিয়ে দিন।
  3. টীকা @NotNullএবং ব্যবহার করুন@Nullable
  4. দ্রুত ব্যর্থ হন এবং পুরো অ্যাপ্লিকেশনটির মাধ্যমে নাল বস্তুর প্রচার এড়ানোর জন্য দৃser়সংস্থানগুলি ব্যবহার করুন যখন সেগুলি নাল হবে না।
  5. প্রথমে একটি পরিচিত বস্তুর সাথে সমান ব্যবহার করুন: if("knownObject".equals(unknownObject)
  6. valueOf()ওভার পছন্দ toString()
  7. নাল নিরাপদ StringUtilsপদ্ধতি ব্যবহার করুন StringUtils.isEmpty(null)
  8. পদ্ধতিগুলিতে জাভা 8 বিকল্প হিসাবে রিটার্ন মান হিসাবে ব্যবহার করুন, ptionচ্ছিক শ্রেণি নাল উল্লেখের পরিবর্তে alচ্ছিক মানগুলি উপস্থাপনের জন্য একটি সমাধান সরবরাহ করে।

4
জে 2 আই প্রকল্পে নালপয়েন্টার ব্যতিক্রম খুব সাধারণ ome কিছু ক্ষেত্রে রেফারেন্স ভেরিয়েবলগুলি নাল মান পেয়েছে o সুতরাং আপনার পরিবর্তনশীল সূচনাটি সঠিকভাবে পরীক্ষা করা উচিত nd এবং শর্তাধীন বিবৃতি দেওয়ার সময় আপনার সর্বদা পরীক্ষা করা উচিত যে পতাকা বা রেফারেন্সটি নাল রয়েছে বা পছন্দ নয়: - যদি (পতাকা! = 0) {আপনার কোড যা পতাকা ব্যবহার করে}
অমরেশ পট্টনায়ক

14
এটি উল্লেখযোগ্য যে কয়েকটি আইডিই (উদাহরণস্বরূপ গ্রহন) কাস্টমাইজযোগ্য টীকাগুলির উপর ভিত্তি করে স্বয়ংক্রিয় নালিকা বিশ্লেষণ প্রস্তাব দেয় (যেমন @Nullableউপরে তালিকাভুক্ত) এবং সম্ভাব্য ত্রুটি সম্পর্কে সতর্ক করে। বিদ্যমান কোড কাঠামোর উপর ভিত্তি করে এ জাতীয় টীকা (যেমন ইন্টেলিজি এটি করতে পারে) নির্ধারণ করা এবং জেনারেট করাও সম্ভব।
জান চিমিয়াক

4
প্রথম জিনিসটি হ'ল নলযোগ্য বস্তুটি ব্যবহার করার আগে আপনাকে ব্যবহার করা উচিত, এটি নাল কিনা তা পরীক্ষা করে দেখানো উচিত f if (obj==null)এটি যদি নাল হয় তবে এটি পরিচালনা করার জন্য আপনারও কোড লিখতে হবে।
লাকমল ভিথানেজ

4
আইএমও, সম্ভব হলে পদ্ধতিগুলিতে নাল বস্তুগুলি ফিরিয়ে দেওয়া এড়ানো ভাল এবং চুক্তি অনুসারে নাল ইনপুট প্যারামিটারগুলিকে কোডের মধ্যে ´if (আপত্তি == নাল) reduce পরিমাণ হ্রাস করা এবং উন্নতি করতে এনটোটেশন ব্যবহার করা ভাল is কোড পাঠযোগ্যতা।
LG

4
এই "সেরা অনুশীলনগুলি" সত্য হিসাবে স্বীকার করার আগে এটি পড়ুন ... সন্তুষ্টি.com
স্টিফেন সি

316

জাভাতে, সমস্ত কিছু (আদিম ধরণেরগুলি বাদ দিয়ে) একটি শ্রেণির আকারে।

আপনি যদি কোনও অবজেক্ট ব্যবহার করতে চান তবে আপনার দুটি পর্যায়ে রয়েছে:

  1. ঘোষণা
  2. আরম্ভ

উদাহরণ:

  • ঘোষণা: Object object;
  • আরম্ভ: object = new Object();

অ্যারে ধারণার জন্য একই:

  • ঘোষণা: Item item[] = new Item[5];
  • আরম্ভ: item[0] = new Item();

আপনি যদি আরম্ভের অংশটি না দিচ্ছেন তবে NullPointerExceptionউত্থান।


3
একটি উদাহরণস্বরূপ পদ্ধতিটি কল করার সময় একটি নালপয়েন্টার এক্সসেপশন প্রায়শই ঘটে example উদাহরণস্বরূপ, আপনি যদি কোনও রেফারেন্স ঘোষণা করেন তবে এটি কোনও উদাহরণকে নির্দেশ না করে, নালপয়েন্টার এক্সসেপশন ঘটবে যখন আপনি এর পদ্ধতিটি কল করবেন। যেমন: আপনারক্লাস রেফ = নাল; // বা রেফ = অন্য রেফ; // তবে আরেকটি রেফ কোনও উদাহরণ রেফারেন্স করেনি রেফ.সোমমথোদ (); // এটি নালপয়েন্টার এক্সসেপশন নিক্ষেপ করবে। সাধারণত এটি এইভাবে ঠিক করুন: পদ্ধতিটি কল করার আগে, রেফারেন্সটি নাল কিনা তা নির্ধারণ করুন। যেমন: যদি (আপনাররফ! = নাল) {yourRef.someMethod (); }
রোহান

2
বা ব্যতিক্রম ক্যাপচার ব্যবহার করুন: যেমন: চেষ্টা করুন {yourRef.someMethod (); } ক্যাচ (নালপয়েন্টার এক্সসেপশন ই) {//
টোডো


315

নাল পয়েন্টার ব্যতিক্রম একটি সূচক যা আপনি কোনও বস্তু এটি আরম্ভ না করে ব্যবহার করছেন।

উদাহরণস্বরূপ, নীচে একটি শিক্ষার্থী শ্রেণি রয়েছে যা এটি আমাদের কোডে ব্যবহার করবে।

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

নীচের কোডটি আপনাকে একটি নাল পয়েন্টার ব্যতিক্রম দেয়।

public class School {

    Student student;

    public School() {
        try {
            student.getId();
        }
        catch(Exception e) {
            System.out.println("Null pointer exception");
        }
    }
}

কারণ আপনি ব্যবহার করছেন studentতবে আপনি নীচে প্রদর্শিত সঠিক কোডের মতো এটি আরম্ভ করতে ভুলে গেছেন:

public class School {

    Student student;

    public School() {
        try {
            student = new Student();
            student.setId(12);
            student.getId();
        }
        catch(Exception e) {
            System.out.println("Null pointer exception");
        }
    }
}

7
যদিও এটি একটি দুর্দান্ত উদাহরণ, আমি কি এটি জিজ্ঞাসা করতে পারি যে এটি ইতিমধ্যে অন্যান্য সমস্ত উত্তরগুলির দ্বারা আবৃত নয় এমন প্রশ্নে কী যুক্ত করে?
রহস্যময়

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

2
একটি এনপিই এমন একটি সূচক হতে পারে যা আপনি অবিচ্ছিন্ন ক্ষেত্রটি ব্যবহার করছেন। এটি অন্য একটি সূচক হতে পারে। এর মতো একক কারণকে অবিস্মরণীয়ভাবে কাউকে এনপিই সমস্যাগুলি সমাধান করতে সহায়তা করে না ... যদি আসল কারণটি এটি না হয়।
স্টিফেন সি

309

ভিতরে জাভা সব ভেরিয়েবল আপনার কি ডিক্লেয়ার আসলে নিজেদের বস্তু বস্তু (বা প্রিমিটিভের) থেকে "রেফারেন্স" এবং না।

আপনি যখন কোনও একটি অবজেক্ট পদ্ধতি কার্যকর করার চেষ্টা করেন, রেফারেন্সটি জীবিত অবজেক্টটিকে সেই পদ্ধতিটি সম্পাদন করতে বলে। তবে যদি রেফারেন্সটি NULL (কোনও কিছুই নয়, শূন্য, অকার্যকর, নদা) উল্লেখ করে থাকে তবে পদ্ধতিটি কার্যকর করার কোনও উপায় নেই। তারপরে রানটাইম আপনাকে একটি নালপয়েন্টারএক্সসেপশন ছুড়ে দিয়ে এটি জানতে দেয়।

আপনার উল্লেখটি নালকে "পয়েন্টিং" করছে, এভাবে "নাল -> পয়েন্টার"।

thisরেফারেন্স ব্যবহার করে অবজেক্টটি ভিএম মেমরি স্পেসে বাস করে এবং এটি অ্যাক্সেসের একমাত্র উপায় । এই উদাহরণটি ধরুন:

public class Some {
    private int id;
    public int getId(){
        return this.id;
    }
    public setId( int newId ) {
        this.id = newId;
    }
}

এবং আপনার কোডের অন্য জায়গায়:

Some reference = new Some();    // Point to a new object of type Some()
Some otherReference = null;     // Initiallly this points to NULL

reference.setId( 1 );           // Execute setId method, now private var id is 1

System.out.println( reference.getId() ); // Prints 1 to the console

otherReference = reference      // Now they both point to the only object.

reference = null;               // "reference" now point to null.

// But "otherReference" still point to the "real" object so this print 1 too...
System.out.println( otherReference.getId() );

// Guess what will happen
System.out.println( reference.getId() ); // :S Throws NullPointerException because "reference" is pointing to NULL remember...

এটি জেনে রাখা একটি গুরুত্বপূর্ণ বিষয় - যখন কোনও বস্তুর সাথে আর কোনও উল্লেখ নেই (উপরের উদাহরণে যখন referenceএবং otherReferenceউভয়ই নালার দিকে ইঙ্গিত করে) তখন বস্তুটি "অ্যাক্সেসযোগ্য" হয়। আমরা এটি নিয়ে কাজ করার কোনও উপায় নেই, সুতরাং এই অবজেক্টটি আবর্জনা সংগ্রহের জন্য প্রস্তুত, এবং কিছু সময়ে, ভিএম এই বস্তুর দ্বারা ব্যবহৃত স্মৃতি মুক্ত করবে এবং অন্যটি বরাদ্দ করবে।


280

NullPointerExceptionএকটির অন্য ঘটনা ঘটে যখন কেউ একটি বস্তুর অ্যারে ঘোষণা করে, ততক্ষণে এর অভ্যন্তরের উপাদানগুলি অবলম্বন করার চেষ্টা করে।

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

তুলনা ক্রমটি বিপরীত হলে এই নির্দিষ্ট এনপিই এড়ানো যেতে পারে; যথা, .equalsগ্যারান্টিযুক্ত নন-নাল অবজেক্টে ব্যবহার করুন।

একটি অ্যারের অভ্যন্তরের সমস্ত উপাদানগুলি তাদের সাধারণ প্রাথমিক মানকে আরম্ভ করা হয় ; যে কোনও ধরণের অবজেক্ট অ্যারের জন্য, এর অর্থ এই যে সমস্ত উপাদান null

আপনি আবশ্যক অ্যারের মধ্যে উপাদানের আরম্ভ করার পূর্বে অ্যাক্সেস বা তাদের dereferencing।

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

উদাহরণস্বরূপ স্তরে অবিশ্রুত বস্তুর অপারেশন (শ্রেণি স্তর নয়) নালপয়েন্টারএক্সসেপশনকে নেতৃত্ব দেবে। অপারেশন উদাহরণ নির্দিষ্ট করা প্রয়োজন। অপারেশনটি যদি শ্রেণি পর্যায়ে থাকে, অবিচ্ছিন্ন বস্তুর উপর স্থিতিশীল পদ্ধতি কল করে বলছে তবে এটি নলপয়েন্টারএক্সেপশন ব্যতিক্রম নিক্ষেপ করবে না। এমনকি আদিম মোড়কের ক্লাসের জিনিসগুলি নলপয়েন্টারএক্সসেপশনকে ছুঁড়ে দেয়।
শৈলেন্দ্র সিং

1. নলপয়েন্টারএক্সেপশন একটি রানটাইম এক্সসেপশন, এর অর্থ যখন আপনার প্রোগ্রামটি চলবে তখন উপস্থিত হবে, আপনি সংকলনের সময় পাবেন না! :(, তবে বেশিরভাগ আইডিই আপনাকে এটি আবিষ্কার করতে সহায়তা করে 2.. অ্যাসাইনমেন্ট স্টেটমেন্টে 'নাল'
মূলশব্দটির ব্যবহার হ্রাস করুন

@ tomj0101 আপনি কেন এই মন্তব্যটি করেছেন তা সম্পর্কে আমি পুরোপুরি অস্পষ্ট ... তবে আপনার দ্বিতীয় বক্তব্যটির আগে একটি প্যাটার্নটি বাতিল হয়ে যাওয়া Optionalছিল। কীওয়ার্ডটি ঠিক আছে। কীভাবে এর বিরুদ্ধে রক্ষা করা যায় তা জানা গুরুত্বপূর্ণ। এটি এটির একটি সাধারণ ঘটনা এবং এটি হ্রাস করার উপায়গুলি সরবরাহ করে।
মাকোটো

নলপয়েন্টারএক্সসেপশন একটি রান-টাইম ব্যতিক্রম যা এটি ধরার জন্য সুপারিশ করা হয় না, বরং এটি এড়িয়ে চলুন।
শোমু

2
@ শমু: কোন মুহুর্তে আমি এমনকি এটি ধরার পরামর্শ দিই?
মাকোটো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.