উত্তর:
আপনি যখন কোনও রেফারেন্স ভেরিয়েবল (অর্থাত্ কোনও বস্তু) ঘোষণা করেন আপনি সত্যই কোনও বস্তুর জন্য পয়েন্টার তৈরি করছেন। নিম্নলিখিত কোডটি বিবেচনা করুন যেখানে আপনি আদিম ধরণের একটি পরিবর্তনশীল ঘোষণা করেন 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
কারণটি নির্ধারণের জন্য কোন পদ্ধতি / সরঞ্জামগুলি ব্যবহার করা যেতে পারে যাতে আপনি ব্যতিক্রমটিকে প্রোগ্রামের অকালমূত সমাপ্ত হতে বাধা দেন?
সন্ধানকারী সোনার এনপিই সনাক্ত করতে পারে। সোনার জেভিএম ডায়নামিকালি কারণে নাল পয়েন্টার ব্যতিক্রম ধরতে পারে
int a=b
খ যদি একটি হয় তবে এনপিই নিক্ষেপ করতে পারে Integer
। এমন কেস রয়েছে যেখানে এটি ডিবাগ করতে বিভ্রান্ত করছে।
NullPointerException
আপনার কোডে সমস্যা এড়ানো একটি অতিরিক্ত উপায় হ'ল ব্যবহার @Nullable
এবং @NotNull
টীকাগুলি। নিম্নলিখিত উত্তরটিতে এ সম্পর্কে আরও তথ্য রয়েছে। যদিও এই উত্তরটি ইন্টেলিজ আইডিই সম্পর্কে সুনির্দিষ্টভাবে রয়েছে তবে এটি অন্যান্য সরঞ্জামগুলিতেও প্রযোজ্য যেমনটি তেহ মন্তব্য থেকে পাওয়া যায়। (বিটিডব্লিউ আমাকে সরাসরি এই উত্তরটি সম্পাদনা করার অনুমতি দেওয়া হচ্ছে না, সম্ভবত লেখক এটি যোগ করতে পারেন?)
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 এমন কোনও অবস্থানের দিকে নির্দেশ করা যা অবৈধ বলে মনে হয়))
null
এটি ব্যবহার, আগে ভালো । স্থানীয় ভেরিয়েবলের সাথে, সংকলকটি এই ত্রুটিটি ধরবে, তবে এই ক্ষেত্রে তা হয় না। সম্ভবত এটি আপনার উত্তরের একটি দরকারী সংযোজন করতে পারে?
শুরু করার জন্য একটি ভাল জায়গা হ'ল জাভাডকস । তারা এটি আবৃত:
যখন কোনও অ্যাপ্লিকেশন কোনও ক্ষেত্রে প্রয়োজন পড়ার ক্ষেত্রে নাল ব্যবহার করার চেষ্টা করে তখন ছুড়ে দেওয়া হয়। এর মধ্যে রয়েছে:
- নাল বস্তুর উদাহরণ পদ্ধতিতে কল করা।
- নাল বস্তুর ক্ষেত্র অ্যাক্সেস বা সংশোধন করা।
- নাল দৈর্ঘ্য গ্রহণ যেমন এটি একটি অ্যারে হয়।
- নলের স্লটগুলিতে অ্যাক্সেস বা সংশোধন করা যেন এটি একটি অ্যারে।
- নাল নিক্ষেপ করা যেন এটি একটি থ্রোয়েবল মান।
নাল অবজেক্টের অন্যান্য অবৈধ ব্যবহারগুলি নির্দেশ করতে অ্যাপ্লিকেশনগুলিকে এই শ্রেণীর উদাহরণগুলি নিক্ষেপ করা উচিত।
এটি এমনও হয় যে আপনি জেএলএস অনুসারে যদি কোনও নাল রেফারেন্স ব্যবহার করার চেষ্টা করেন 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();
}
}
আরো দেখুন:
যদি আপনি সমস্যাটি ডিবাগ করার চেষ্টা করেন এবং এখনও সমাধান না পান তবে আপনি আরও সাহায্যের জন্য একটি প্রশ্ন পোস্ট করতে পারেন, তবে আপনি এখন পর্যন্ত যা চেষ্টা করেছেন তা অন্তর্ভুক্ত করার বিষয়টি নিশ্চিত করুন। সর্বনিম্ন, প্রশ্নের স্ট্যাকট্রেস অন্তর্ভুক্ত করুন এবং কোডটিতে গুরুত্বপূর্ণ লাইন নম্বরগুলি চিহ্নিত করুন । এছাড়াও, প্রথমে কোডটি সরল করার চেষ্টা করুন ( এসএসসিসিই দেখুন )।
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)
এটি আমাদের বেশ কয়েকটি বিষয় বলে:
main
পদ্ধতিতে ছিলামTest
ক্লাসের ।আপনি যদি উপরের ফাইলে লাইনগুলি গণনা করেন তবে লাইন 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
।
এটি এমন যে আপনি কোনও বস্তুর অ্যাক্সেস করার চেষ্টা করছেন null
। নীচে উদাহরণ বিবেচনা করুন:
TypeA objA;
এই মুহুর্তে আপনি এই বিষয়টিকে সবেমাত্র ঘোষণা করেছেন তবে আরম্ভ বা তাত্ক্ষণিক নয় । এবং যখনই আপনি এর মধ্যে কোনও সম্পত্তি বা পদ্ধতি অ্যাক্সেস করার চেষ্টা করবেন তখন তা ছুঁড়ে যাবে NullPointerException
যা বোঝা যায়।
নীচের উদাহরণটিও দেখুন:
String a = null;
System.out.println(a.toString()); // NullPointerException will be thrown
কোনও অ্যাপ্লিকেশন প্রয়োজনীয় ক্ষেত্রে কোনও অ্যাপ্লিকেশন নাল ব্যবহার করার চেষ্টা করার সময় একটি নাল পয়েন্টার ব্যতিক্রম নিক্ষেপ করা হয়। এর মধ্যে রয়েছে:
null
বস্তুর উদাহরণ পদ্ধতি কল করা Callnull
অবজেক্টের ক্ষেত্র অ্যাক্সেস বা সংশোধন করা ।null
যেন এটি একটি অ্যারে হয়।null
করা যেন এটি একটি অ্যারে।null
করা যেন এটি একটি হ্রাসযোগ্য মান।অ্যাপ্লিকেশনগুলির অন্যান্য অবৈধ ব্যবহারগুলি নির্দেশ করতে এই শ্রেণীর উদাহরণগুলি নিক্ষেপ করা উচিত null
অবজেক্টের ।
তথ্যসূত্র: http://docs.oracle.com/javase/8/docs/api/java/lang/NullPointerException.html
null
একটি synchronized
ব্লকের null
লক্ষ্য হিসাবে ব্যবহার করে, ২) এটিকে লক্ষ্য হিসাবে ব্যবহার করে switch
এবং আনবক্সিং করতে null
।
একটি null
পয়েন্টার এক কোথাও না যে পয়েন্ট। যখন আপনি একটি পয়েন্টার ডি-রেফারেন্স p
, আপনি বলতে পি "আমার অবস্থান সঞ্চিত ডেটা দিতে" "। যখন p
একটি হল null
পয়েন্টার, অবস্থান সঞ্চিত p
হয় nowhere
, আপনি বলছে" 'কোথাও না' অবস্থানে আমার ডেটা দিতে "। স্পষ্টতই, এটি এটি করতে পারে না, তাই এটি একটি নিক্ষেপ করেnull pointer exception
।
সাধারণভাবে, কারণ কিছু সঠিকভাবে শুরু হয়নি।
NULL
হিসাবে লেখা হয় null
। এবং এটি একটি কেস সংবেদনশীল জিনিস।
এটি কীভাবে হয় এবং কীভাবে এটি ঠিক করা যায় তার ব্যাখ্যা দেওয়ার জন্য ইতিমধ্যে প্রচুর ব্যাখ্যা উপস্থিত রয়েছে, তবে এগুলি এড়ানোর জন্য আপনার সর্বোত্তম অভ্যাসগুলিও অনুসরণ করা উচিত NullPointerException
।
আরও দেখুন: সেরা অনুশীলনের একটি ভাল তালিকা
আমি final
সংশোধনকারীটির একটি ভাল ব্যবহার করব, খুব গুরুত্বপূর্ণ ।
জাভাতে যখনই প্রযোজ্য "চূড়ান্ত" সংশোধক ব্যবহার করুন
সারসংক্ষেপ:
final
ভাল আরম্ভের প্রয়োগ সংশোধক ।@NotNull
এবং ব্যবহার করুন@Nullable
if("knownObject".equals(unknownObject)
valueOf()
ওভার পছন্দ toString()
।StringUtils
পদ্ধতি ব্যবহার করুন StringUtils.isEmpty(null)
।@Nullable
উপরে তালিকাভুক্ত) এবং সম্ভাব্য ত্রুটি সম্পর্কে সতর্ক করে। বিদ্যমান কোড কাঠামোর উপর ভিত্তি করে এ জাতীয় টীকা (যেমন ইন্টেলিজি এটি করতে পারে) নির্ধারণ করা এবং জেনারেট করাও সম্ভব।
if (obj==null)
এটি যদি নাল হয় তবে এটি পরিচালনা করার জন্য আপনারও কোড লিখতে হবে।
জাভাতে, সমস্ত কিছু (আদিম ধরণেরগুলি বাদ দিয়ে) একটি শ্রেণির আকারে।
আপনি যদি কোনও অবজেক্ট ব্যবহার করতে চান তবে আপনার দুটি পর্যায়ে রয়েছে:
উদাহরণ:
Object object;
object = new Object();
অ্যারে ধারণার জন্য একই:
Item item[] = new Item[5];
item[0] = new Item();
আপনি যদি আরম্ভের অংশটি না দিচ্ছেন তবে NullPointerException
উত্থান।
নাল পয়েন্টার ব্যতিক্রম একটি সূচক যা আপনি কোনও বস্তু এটি আরম্ভ না করে ব্যবহার করছেন।
উদাহরণস্বরূপ, নীচে একটি শিক্ষার্থী শ্রেণি রয়েছে যা এটি আমাদের কোডে ব্যবহার করবে।
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");
}
}
}
ভিতরে জাভা সব ভেরিয়েবল আপনার কি ডিক্লেয়ার আসলে নিজেদের বস্তু বস্তু (বা প্রিমিটিভের) থেকে "রেফারেন্স" এবং না।
আপনি যখন কোনও একটি অবজেক্ট পদ্ধতি কার্যকর করার চেষ্টা করেন, রেফারেন্সটি জীবিত অবজেক্টটিকে সেই পদ্ধতিটি সম্পাদন করতে বলে। তবে যদি রেফারেন্সটি 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
উভয়ই নালার দিকে ইঙ্গিত করে) তখন বস্তুটি "অ্যাক্সেসযোগ্য" হয়। আমরা এটি নিয়ে কাজ করার কোনও উপায় নেই, সুতরাং এই অবজেক্টটি আবর্জনা সংগ্রহের জন্য প্রস্তুত, এবং কিছু সময়ে, ভিএম এই বস্তুর দ্বারা ব্যবহৃত স্মৃতি মুক্ত করবে এবং অন্যটি বরাদ্দ করবে।
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));
}
Optional
ছিল। কীওয়ার্ডটি ঠিক আছে। কীভাবে এর বিরুদ্ধে রক্ষা করা যায় তা জানা গুরুত্বপূর্ণ। এটি এটির একটি সাধারণ ঘটনা এবং এটি হ্রাস করার উপায়গুলি সরবরাহ করে।