requireNonNull()কোনও পদ্ধতিতে প্রথম বিবৃতি হিসাবে ব্যবহার করা এখনই / দ্রুত ব্যতিক্রমের কারণ চিহ্নিত করার অনুমতি দেয়।
স্ট্যাকট্রেস স্পষ্টভাবে ইঙ্গিত করে যে পদ্ধতিটিতে প্রবেশের সাথে সাথে ব্যতিক্রমটি ছুঁড়ে ফেলা হয়েছিল কারণ কলার প্রয়োজনীয়তা / চুক্তিকে সম্মান করেননি।
একটি পাসিং nullঅন্য পদ্ধতি থেকে বস্তুর পারে প্রকৃতপক্ষে একটি সময়ে একটি ব্যতিক্রম কিন্তু সমস্যার কারণ আরো বুঝতে যেমন ব্যতিক্রম একটি নির্দিষ্ট আবাহন নিক্ষিপ্ত হবে জটিল হতে পারে ঘটান nullবস্তু আরও অনেক হতে পারে।
এখানে একটি কংক্রিট এবং আসল উদাহরণ রয়েছে যা দেখায় যে কেন আমাদের সাধারণভাবে দ্রুত ব্যর্থ Object.requireNonNull()হতে হবে এবং বিশেষত ব্যবহার না করা বা না হওয়ার জন্য ডিজাইন করা প্যারামিটারগুলিতে কোনও নাল চেক করতে কোনও উপায় null।
একটি ধরুন Dictionaryবর্গ করে একটি composes LookupServiceএবং Listএর Stringঅন্তর্ভুক্ত শব্দ উপস্থাপন করে। এই ক্ষেত্রগুলি হতে হবে ডিজাইন করা হয় nullএবং এই এক পাস করা হয়েছে Dictionary কন্সট্রাকটর।
এখন একটা 'খারাপ' বাস্তবায়ন অনুমান করা Dictionaryছাড়া nullপদ্ধতি এন্ট্রি (এখানে যে কন্সট্রাকটর হয়) মধ্যে চেক:
public class Dictionary {
private final List<String> words;
private final LookupService lookupService;
public Dictionary(List<String> words) {
this.words = this.words;
this.lookupService = new LookupService(words);
}
public boolean isFirstElement(String userData) {
return lookupService.isFirstElement(userData);
}
}
public class LookupService {
List<String> words;
public LookupService(List<String> words) {
this.words = words;
}
public boolean isFirstElement(String userData) {
return words.get(0).contains(userData);
}
}
এখন, প্যারামিটারের জন্য Dictionaryএকটি nullরেফারেন্স সহ কনস্ট্রাক্টরকে অনুরোধ করব words:
Dictionary dictionary = new Dictionary(null);
// exception thrown lately : only in the next statement
boolean isFirstElement = dictionary.isFirstElement("anyThing");
জেভিএম এই বিবৃতিতে এনপিই নিক্ষেপ করেছে:
return words.get(0).contains(userData);
থ্রেড "মূল" java.lang. নালপয়েন্টারএক্সেপশন ব্যতিক্রম
লুকআপ সার্ভিস.আইএস ফার্স্ট এলিমেটে (লুকআপ সার্ভিস.জভা ৫৫)
ডিকশনারি.আইসফারস্টিমেটমেন্টে (অভিধান.জভা ১৫:১৫)
ডিকশনারি.মেনে (অভিধান.জভা २२)
ব্যতিক্রমটি LookupServiceক্লাসে ট্রিগার করা হয়েছে যখন এর উত্সটি আগে ভাল ছিল ( Dictionaryকনস্ট্রাক্টর)। এটি সামগ্রিক ইস্যু বিশ্লেষণকে অনেক কম স্পষ্ট করে তোলে।
হয় words null? হয় words.get(0) null? দুটোই? কেন একজন, অন্য বা সম্ভবত দুজনেই null? এটি Dictionary(কনস্ট্রাক্টর? অনুরোধ পদ্ধতিতে) কোনও কোডিং ত্রুটি ? এটিতে কোডিং ত্রুটি রয়েছে LookupService? (কনস্ট্রাক্টর? চালিত পদ্ধতি?)?
শেষ অবধি, ত্রুটির উত্স খুঁজে পেতে আমাদের আরও কোড পরিদর্শন করতে হবে এবং আরও জটিল শ্রেণিতে সম্ভবত এটি কী ঘটেছিল তা আরও সহজে বুঝতে একটি ডিবাগার ব্যবহার করতে পারেন।
তবে কেন একটি সাধারণ জিনিস (নাল চেকের অভাব) জটিল সমস্যা হয়ে ওঠে?
কারণ আমরা নিম্ন উপাদানগুলিতে নির্দিষ্ট উপাদান ফুটোতে প্রারম্ভিক বাগ / অভাব চিহ্নিত করতে পেরেছি।
মনে করুন যে LookupServiceএটি কোনও স্থানীয় পরিষেবা নয় বরং একটি রিমোট সার্ভিস বা তৃতীয় পক্ষের একটি লাইব্রেরির সাথে কয়েকটি ডিবাগিং তথ্য ছিল বা ধারণা করুন যে nullসনাক্তকরণের আগে আপনার কাছে 2 স্তর ছাড়া 4 বা 5 স্তর অবজেক্টের অনুরোধ নেই ? সমস্যাটি বিশ্লেষণ করা আরও জটিল হবে।
তাই অনুগ্রহ করার উপায়:
public Dictionary(List<String> words) {
this.words = Objects.requireNonNull(words);
this.lookupService = new LookupService(words);
}
এইভাবে, কোনও মাথা ব্যথা নয়: এটি পাওয়ার সাথে সাথে আমরা ব্যতিক্রম ছুঁড়ে ফেলি:
// exception thrown early : in the constructor
Dictionary dictionary = new Dictionary(null);
// we never arrive here
boolean isFirstElement = dictionary.isFirstElement("anyThing");
থ্রেড "মূল" java.lang. নালপয়েন্টারএক্সেপশন ব্যতিক্রম
java.util.Objects.requireNonNull (অবজেক্টস.জভা ২০:০৩)
com.D অভিধান এ। (অভিধান.জভা 15:15)
com.D অভিধান.main (ডিকশনারি.জভা ২৪)
নোট করুন যে আমি এখানে একটি কনস্ট্রাক্টর দিয়ে সমস্যাটি বর্ণনা করেছি তবে একটি পদ্ধতিতে অনুরোধে একই নন চেক সীমাবদ্ধতা থাকতে পারে।