java - এড়িয়ে চলুন!=নিল বিবৃতি




object nullpointerexception (20)

যদি অনির্দিষ্ট মান অনুমতি দেওয়া হয় না:

আপনি সম্ভাব্য নাল dereferencing সম্পর্কে আপনাকে সতর্ক করার জন্য আপনার আইডিই কনফিগার করতে পারেন। যেমন Eclipse তে, পছন্দসমূহ> জাভা> কম্পাইলার> ত্রুটি / সতর্কতা / নিল বিশ্লেষণ দেখুন

যদি অনির্দিষ্ট মান অনুমোদিত হয়:

যদি আপনি একটি নতুন API সংজ্ঞায়িত করতে চান যেখানে অনির্ধারিত মানগুলি জ্ঞান করে , বিকল্প প্যাটার্ন ব্যবহার করুন (কার্যকরী ভাষা থেকে পরিচিত হতে পারে)। এটি নিম্নলিখিত সুবিধা আছে:

  • এটি কোনও ইনপুট বা আউটপুট বিদ্যমান কিনা তা API এ স্পষ্টভাবে উল্লেখ করা হয়েছে।
  • কম্পাইলার আপনাকে "অনির্ধারিত" ক্ষেত্রে পরিচালনা করতে বাধ্য করে।
  • বিকল্প একটি monad , তাই verbose নাল পরীক্ষণের জন্য কোন প্রয়োজন নেই, মান (example) নিরাপদভাবে মান ব্যবহার করার জন্য মানচিত্র / ফোরাম / getOrElse বা অনুরূপ সমন্বয়কারী ব্যবহার করুন (example)

জাভা 8 একটি অন্তর্নির্মিত Optional ক্লাস (প্রস্তাবিত) আছে; পূর্ববর্তী সংস্করণগুলির জন্য, লাইব্রেরির বিকল্প রয়েছে, উদাহরণস্বরূপ Guava Optional বা Guava Option । তবে জাভা (86 এমনকি 8) বিকল্পে অনেক কার্যকরী-শৈলী নকশার মতো, বেশ কয়েকটি বয়লারপ্লেট ফলস্বরূপ, যা কম ক্রিয়াজোজ জেভিএম ভাষা ব্যবহার করে আপনি কমাতে পারেন, যেমন স্কাল বা এক্সটেন্ড।

যদি আপনি কোনও API ব্যবহার করেন যা নুলগুলি ফেরত দিতে পারে তবে আপনি জাভাতে অনেক কিছু করতে পারবেন না। Xtend এবং Groovy Elvis অপারেটর আছে ?: এবং নাল নিরাপদ dereference অপারেটর ?. , তবে নোট রেফারেন্সের ক্ষেত্রে এটি প্রত্যাবর্তন করে নোট করুন, তাই এটি কেবল "নষ্ট করা" সঠিকভাবে পরিচালনা করা।

আমি object != null ব্যবহার object != null NullPointerException এড়াতে অনেক NullPointerException

এই একটি ভাল বিকল্প আছে?

উদাহরণ স্বরূপ:

if (someobject != null) {
    someobject.doCalc();
}

এটি একটি NullPointerException এড়ানো হয়, যখন এটি অজানা হয় তখন অজানা হয় না।

মনে রাখবেন যে গৃহীত উত্তরটি পুরনো হতে পারে, আরো সাম্প্রতিক পদ্ধতির জন্য https://stackoverflow.com/a/2386013/12943 দেখুন।


যদি নাল-মান অনুমতি দেওয়া হয় না

আপনার পদ্ধতিটি যদি বাহ্যিকভাবে বলা হয়, তবে এরকম কিছু দিয়ে শুরু করুন:

public void method(Object object) {
  if (object == null) {
    throw new IllegalArgumentException("...");
  }

তারপর, যে পদ্ধতির বাকি অংশে, আপনি জানেন যে object নল নয়।

যদি এটি একটি অভ্যন্তরীণ পদ্ধতি (কোনও API এর অংশ নয়), এটি কেবল নথির মতো নথির নয় এবং এটিই এটি।

উদাহরণ:

public String getFirst3Chars(String text) {
  return text.subString(0, 3);
}

যাইহোক, যদি আপনার পদ্ধতিটি মানটি ঠিক করে দেয় এবং পরবর্তী পদ্ধতিতে এটি পাস করে তবে এটি সমস্যাযুক্ত হতে পারে। যে ক্ষেত্রে আপনি উপরের হিসাবে যুক্তি চেক করতে পারেন।

যদি নাল অনুমতি দেওয়া হয়

এই সত্যিই নির্ভর করে। যদি আমি প্রায়ই এমন কিছু করি তবে এটি অনুসন্ধান করুন:

if (object == null) {
  // something
} else {
  // something else
}

তাই আমি শাখা, এবং দুটি সম্পূর্ণ ভিন্ন জিনিস না। কোন কুৎসিত কোড স্নিপেট নেই, কারণ আমি ডেটার উপর নির্ভর করে সত্যিই দুটি ভিন্ন জিনিস করতে হবে। উদাহরণস্বরূপ, আমি ইনপুট কাজ করতে হবে, অথবা আমি একটি ভাল ডিফল্ট মান গণনা করা উচিত?

এটা আসলে আমার জন্য idiom ব্যবহার করতে বিরল " if (object != null && ... "।

আপনি উদাহরণস্বরূপ আপনাকে উদাহরণ দিতে সহজ হতে পারেন, যদি আপনি উদাহরণস্বরূপ যেখানে আপনি সাধারণত ছদ্মবেশ ব্যবহার করেন উদাহরণ দেখান।


আপনি কী ধরনের বস্তু পরীক্ষা করছেন তা নির্ভর করে আপনি অ্যাপ্যাচ কমন্সে কিছু ক্লাস ব্যবহার করতে পারবেন যেমন: অ্যাপ্যাচ কমন্স ল্যাং এবং অ্যাপাচি কমন্স সংগ্রহ

উদাহরণ:

String foo;
...
if( StringUtils.isBlank( foo ) ) {
   ///do something
}

বা (আপনি চেক করার প্রয়োজন কি উপর নির্ভর করে):

String foo;
...
if( StringUtils.isEmpty( foo ) ) {
   ///do something
}

StringUtils ক্লাস শুধুমাত্র এক এক হয়; কম নিরাপদ ম্যানিপুলেশন যে কমন্স বেশ কয়েক ভাল ক্লাস আছে।

আপনি যখন Apache লাইব্রেরি (commons-lang-2.4.jar) অন্তর্ভুক্ত করেন তখন জাভাতে আপনি কিভাবে নল ভ্যালিডেশন ব্যবহার করতে পারেন তার একটি উদাহরণ অনুসরণ করে।

public DOCUMENT read(String xml, ValidationEventHandler validationEventHandler) {
    Validate.notNull(validationEventHandler,"ValidationHandler not Injected");
    return read(new StringReader(xml), true, validationEventHandler);
}

এবং আপনি স্প্রিং ব্যবহার করছেন, স্প্রিং এর প্যাকেজের একই কার্যকারিতা রয়েছে, লাইব্রেরি দেখুন (বসন্ত-2.4.6.jar)

বসন্ত থেকে এই স্ট্যাটিক ক্লাসিফটি ব্যবহার করার উদাহরণ (org.springframework.util.Assert)

Assert.notNull(validationEventHandler,"ValidationHandler not Injected");

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

এই অন্য উপায়টি রাখতে, দুটি উদাহরণ রয়েছে যেখানে নিল চেকিং আসে:

  1. যেখানে নুল চুক্তি শর্তাবলী একটি বৈধ প্রতিক্রিয়া হয়; এবং

  2. এটি একটি বৈধ প্রতিক্রিয়া যেখানে।

(2) সহজ। উভয় বিবৃতি বিবৃতি (assertions) বা ব্যর্থতা ব্যবহার করুন (উদাহরণস্বরূপ, NullPointerException ) ব্যবহার করুন। Asstions একটি অত্যন্ত আন্ডারওয়্যার জাভা বৈশিষ্ট্য 1.4 যোগ করা হয়েছে। সিনট্যাক্স হল:

assert <condition>

অথবা

assert <condition> : <object>

যেখানে <condition> একটি বুলিয়ান এক্সপ্রেশন এবং <object> এমন একটি বস্তু যার থেকে toString() পদ্ধতির আউটপুট ত্রুটিটিতে অন্তর্ভুক্ত করা হবে।

শর্তটি সত্য না হলে একটি assert বিবৃতি একটি Error ( AssertionError ) ফেলে দেয়। ডিফল্টরূপে, জাভা অঙ্গীকার উপেক্ষা করে। আপনি JVM এ বিকল্পটি পাস করে বিবৃতি সক্ষম করতে পারেন। আপনি পৃথক ক্লাস এবং প্যাকেজ জন্য assertions সক্ষম এবং নিষ্ক্রিয় করতে পারেন। এর মানে হল যে আপনি উন্নয়নশীল এবং পরীক্ষার সময় কথার সাথে কোডটি যাচাই করতে পারেন এবং উৎপাদন পরিবেশে তাদের অক্ষম করতে পারেন, যদিও আমার পরীক্ষার বিবৃতি থেকে কোনও কার্যকারিতা প্রভাবের পাশে দেখানো হয়নি।

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

(1) একটু কঠিন। যদি আপনি যে কোডটি কল করছেন তার উপর আপনার কোন নিয়ন্ত্রণ না থাকে তবে আপনি আটকে আছেন। যদি নাল একটি বৈধ প্রতিক্রিয়া হয় তবে আপনাকে এটি পরীক্ষা করতে হবে।

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

অ সংগ্রহ সঙ্গে এটি কঠিন হতে পারে। একটি উদাহরণ হিসাবে বিবেচনা করুন: যদি আপনার এই ইন্টারফেস থাকে:

public interface Action {
  void doSomething();
}

public interface Parser {
  Action findAction(String userInput);
}

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

একটি বিকল্প সমাধান নাল ফিরে না এবং পরিবর্তে নিল অবজেক্ট প্যাটার্ন ব্যবহার করা হয়:

public class MyParser implements Parser {
  private static Action DO_NOTHING = new Action() {
    public void doSomething() { /* do nothing */ }
  };

  public Action findAction(String userInput) {
    // ...
    if ( /* we can't find any actions */ ) {
      return DO_NOTHING;
    }
  }
}

তুলনা করা:

Parser parser = ParserFactory.getParser();
if (parser == null) {
  // now what?
  // this would be an example of where null isn't (or shouldn't be) a valid response
}
Action action = parser.findAction(someInput);
if (action == null) {
  // do nothing
} else {
  action.doSomething();
}

থেকে

ParserFactory.getParser().findAction(someInput).doSomething();

এটি একটি আরো ভাল নকশা যা এটি আরও সংক্ষিপ্ত কোড বাড়ে।

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

try {
    ParserFactory.getParser().findAction(someInput).doSomething();
} catch(ActionNotFoundException anfe) {
    userConsole.err(anfe.getMessage());
}

অথবা যদি আপনার মনে হয় যে চেষ্টা / ধরা প্রক্রিয়াটি খুব কুৎসিত, আপনার ডিফল্ট অ্যাকশনটি ব্যতীত ব্যবহারকারীর প্রতিক্রিয়া প্রদান করা উচিত নয়।

public Action findAction(final String userInput) {
    /* Code to return requested Action if found */
    return new Action() {
        public void doSomething() {
            userConsole.err("Action not found: " + userInput);
        }
    }
}

কখনও কখনও, আপনার এমন পদ্ধতি রয়েছে যা তার প্যারামিটারগুলিতে কাজ করে যা একটি সমমানের ক্রিয়াকলাপ সংজ্ঞায়িত করে:

a.f(b); <-> b.f(a);

আপনি যদি জানেন না খ কখনও নাল হতে পারে, আপনি শুধু এটি স্যাপ করতে পারেন। এটি সমান জন্য সবচেয়ে দরকারী: foo.equals("bar"); ভাল "bar".equals(foo);


গুগল সংগ্রহের কাঠামো নল চেক অর্জন করার জন্য একটি ভাল এবং মার্জিত উপায় প্রস্তাব।

লাইব্রেরির ক্লাসে একটি পদ্ধতি রয়েছে:

static <T> T checkNotNull(T e) {
   if (e == null) {
      throw new NullPointerException();
   }
   return e;
}

এবং ব্যবহার ( import static সঙ্গে):

...
void foo(int a, Person p) {
   if (checkNotNull(p).getAge() > a) {
      ...
   }
   else {
      ...
   }
}
...

অথবা আপনার উদাহরণে:

checkNotNull(someobject).doCalc();

নুল অবজেক্ট প্যাটার্নের পরিবর্তে - যার ব্যবহার রয়েছে - আপনি এমন পরিস্থিতিতে বিবেচনা করতে পারেন যেখানে নল বস্তু একটি বাগ।

ব্যতিক্রম নিক্ষেপ করা হলে, স্ট্যাক ট্রেস পরীক্ষা করুন এবং বাগ মাধ্যমে কাজ।


বাহ, আমি প্রায়শই আরেকটি উত্তর যোগ করতে ঘৃণা করি যখন আমাদের 57 টি ভিন্ন উপায় আছে যা NullObject pattern সুপারিশ করার জন্য আছে, কিন্তু আমার মনে হয় যে এই প্রশ্নে আগ্রহী কিছু লোক জানতে পারে যে জাভা 7 এর জন্য টেবিলটিতে একটি প্রস্তাব রয়েছে "নাল" -সেফ হ্যান্ডলিং " -অ-সমান-নল-লুলিকের জন্য একটি সুষম সিনট্যাক্স।

অ্যালেক্স মিলারের দেওয়া উদাহরণটি এই রকম দেখাচ্ছে:

public String getPostcode(Person person) {  
  return person?.getAddress()?.getPostcode();  
}  

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

হালনাগাদ: জাভা 7 এর একটি নল-নিরাপদ অপারেটরের জন্য একটি proposed প্রকল্প মুদ্রা অধীনে জমা দেওয়া হয়েছে সিনট্যাক্স উপরে উদাহরণ তুলনায় একটু ভিন্ন, কিন্তু এটি একই ধারণা।

হালনাগাদ: নাল-নিরাপদ অপারেটর প্রস্তাব প্রকল্প মুদ্রায় এটি তৈরি করে নি। সুতরাং, আপনি জাভা 7 এ এই সিনট্যাক্সটি দেখবেন না।


জেটব্রেইনস ইন্টেলিজ আইডিএএ , ইক্লিপস বা নেটবিনস বা সার্চবগগুলি মত একটি টুল ব্যবহার করে আপনি যদি জাভা আইডিই ব্যবহার করেন (তবে ব্যবহারের জন্য পরিকল্পনা করছেন) তাহলে আপনি এই সমস্যা সমাধানের জন্য টীকাগুলি ব্যবহার করতে পারেন।

মূলত, আপনি @Nullable এবং @NotNull পেয়েছেন।

আপনি পদ্ধতি এবং পরামিতি ব্যবহার করতে পারেন, যেমন:

@NotNull public static String helloWorld() {
    return "Hello World";
}

অথবা

@Nullable public static String helloWorld() {
    return "Hello World";
}

দ্বিতীয় উদাহরণ কম্পাইল হবে না (IntelliJ IDEA)।

যখন আপনি helloWorld() অন্য অংশে প্রথম helloWorld() ফাংশন ব্যবহার করেন:

public static void main(String[] args)
{
    String result = helloWorld();
    if(result != null) {
        System.out.println(result);
    }
}

এখন IntelliJ IDEA কম্পাইলার আপনাকে বলবে যে চেকটি নিরর্থক, যেহেতু helloWorld() ফাংশন null কখনও ফিরে আসবে না।

পরামিতি ব্যবহার করে

void someMethod(@NotNull someParameter) { }

যদি আপনি কিছু লিখতে চান:

someMethod(null);

এই কম্পাইল হবে না।

@Nullable ব্যবহার করে শেষ উদাহরণ

@Nullable iWantToDestroyEverything() { return null; }

এটা করছি

iWantToDestroyEverything().something();

এবং আপনি নিশ্চিত হতে পারেন যে এটি ঘটবে না। :)

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

@Nullable @NotNull 10.5 এবং এর মধ্যে, তারা অন্য কোন @Nullable @NotNull @Nullable @NotNull বাস্তবায়নের জন্য সমর্থন যোগ করেছে।

ব্লগ পোস্টটি আরও নমনীয় এবং কনফিগারযোগ্য @ নুলেবল / @ নোটনুল এনটেশনস দেখুন


অবশেষে, এই সমস্যার সমাধান করার একমাত্র উপায় একটি ভিন্ন প্রোগ্রামিং ভাষা ব্যবহার করে:

  • Objective-C তে, আপনি একটি পদ্ধতি চালু করার সমতুল্য করতে পারেন nilএবং একেবারে কিছুই ঘটবে না। এটি সর্বাধিক নাল পরীক্ষা অপ্রয়োজনীয় করে তোলে, তবে এটি নির্ণয়ের জন্য ত্রুটিগুলিকে আরও কঠিন করে তুলতে পারে।
  • ইন Nice একটি সম্ভাব্য শূন্য সংস্করণ এবং একটি না নাল সংস্করণ:, একটি জাভা-ডিরাইভড ভাষা, সেখানে সব ধরনের দুটি সংস্করণ আছে। আপনি শুধুমাত্র নকল ধরনের উপর পদ্ধতি আহ্বান করতে পারেন। সম্ভাব্য-নুল প্রকারগুলি নুলের জন্য স্পষ্ট পরীক্ষণের মাধ্যমে নোট-নুল প্রকারগুলিতে রূপান্তরিত করা যেতে পারে। এই সহজে কোথায় এবং কোথায় না যেখানে এটি জানতে অনেক সহজ করে তোলে।

এটি বেশিরভাগ ডেভেলপারদের জন্য সবচেয়ে সাধারণ ত্রুটি।

আমরা এই হ্যান্ডেল করার উপায় আছে।

পদ্ধতি 1:

org.apache.commons.lang.Validate //using apache framework

notNull (বস্তু বস্তু, স্ট্রিং বার্তা)

পদ্ধতি 2:

if(someObject!=null){ // simply checking against null
}

পদ্ধতি 3:

@isNull @Nullable  // using annotation based validation

পদ্ধতি 4:

// by writing static method and calling it across whereever we needed to check the validation

static <T> T isNull(someObject e){  
   if(e == null){
      throw new NullPointerException();
   }
   return e;
}

জাভা আসলে সাধারণ "সমস্যা"।

প্রথম, আমার চিন্তা এই:

আমি নুল একটি বৈধ মান না যেখানে নুল পাস করা হয়েছিল যখন কিছু "খাওয়া" খারাপ। যদি আপনি কোনও ধরণের ত্রুটির সাথে পদ্ধতিটি প্রস্থান না করেন তবে এর অর্থ আপনার পদ্ধতিতে কোনও ভুল ঘটেনি যা সত্য নয়। তারপর আপনি সম্ভবত এই ক্ষেত্রে নাল ফিরে, এবং গ্রহণ পদ্ধতিতে আপনি আবার নল জন্য চেক, এবং এটি শেষ হয় না, এবং আপনি "যদি! = নাল", ইত্যাদি সঙ্গে শেষ পর্যন্ত ..

সুতরাং, IMHO, নাল অবশ্যই একটি গুরুতর ত্রুটি হওয়া উচিত যা আরও নির্বাহকে বাধা দেয় (অর্থাৎ, যেখানে নলটি বৈধ মান নয়)।

আমি এই সমস্যার সমাধান উপায় এই হল:

প্রথম, আমি এই সম্মেলন অনুসরণ করি:

  1. সমস্ত পাবলিক পদ্ধতি / এপিআই সবসময় নল জন্য তার আর্গুমেন্ট চেক
  2. সমস্ত প্রাইভেট পদ্ধতিগুলি নিয়ন্ত্রিত পদ্ধতিগুলির কারণে নিল জন্য পরীক্ষা করে না (উপরে উল্লিখিত না থাকলে কেবল নলপয়েন্টার ব্যতিক্রমের সাথে মরতে দিন)
  3. নাল জন্য চেক না শুধুমাত্র একমাত্র পদ্ধতি ইউটিলিটি পদ্ধতি। তারা জনসাধারণ, কিন্তু যদি আপনি কোন কারণে তাদের কল করেন, আপনি জানেন যে পরামিতি আপনি পাস করেন। এটি জল সরবরাহ না করে কেটলে পানি উড়াতে চাইছে ...

এবং পরিশেষে, কোডে, পাবলিক পদ্ধতির প্রথম লাইন এই রকম হয়:

ValidationUtils.getNullValidator().addParam(plans, "plans").addParam(persons, "persons").validate();

উল্লেখ্য যে addParam () স্ব স্ব প্রদান করে, যাতে আপনি চেক করার জন্য আরও পরামিতি যোগ করতে পারেন।

কোনও প্যারামিটার validate()নিল না ValidationExceptionথাকলে পদ্ধতিটি নিক্ষেপ করা হবে (চেক করা বা অনির্ধারিত একটি ডিজাইন / স্বাদ সমস্যা, তবে আমার ValidationExceptionচেক করা আছে)।

void validate() throws ValidationException;

বার্তাটি নিম্নলিখিত পাঠ্য ধারণ করবে, উদাহরণস্বরূপ, "পরিকল্পনা" নিল হয়:

" অবৈধ যুক্তি মূল্য মান প্যারামিটার [পরিকল্পনা] জন্য সম্মুখীন হয় "

আপনি দেখতে পারেন, addParam () পদ্ধতি (স্ট্রিং) এর দ্বিতীয় মানটি ব্যবহারকারীর বার্তার জন্য প্রয়োজন, কারণ আপনি সহজেই পারফেক্ট নামটি সনাক্ত করতে পারবেন না (এমনকি এই পোস্টের বিষয়ও নয় ...)।

এবং হ্যাঁ, আমরা জানি যে এই লাইনের বাইরে আমরা আর একটি নিখুঁত মান পাবে না তাই আমরা কেবল সেই বস্তুর উপর নিরাপদ পদ্ধতিগুলি আহবান করব।

এই ভাবে, কোডটি পরিষ্কার, সহজে রক্ষণযোগ্য এবং পাঠযোগ্য।


আমি অত্যন্ত প্রতিটি পরিস্থিতির মধ্যে নিল বস্তু ব্যবহার করে সুপারিশ উত্তর উপেক্ষা। এই প্যাটার্ন চুক্তিটি ভেঙ্গে দিতে পারে এবং তাদের সমাধান করার পরিবর্তে গভীর ও গভীর সমস্যাগুলি বধ করে দিতে পারে, উল্লেখ করে না যে অযথাযথভাবে ব্যবহৃত বোয়াইলপ্লেট কোডটি আরেকটি ঢাল তৈরি করবে যা ভবিষ্যতে রক্ষণাবেক্ষণের প্রয়োজন হবে।

প্রকৃতপক্ষে যদি কোন পদ্ধতি থেকে ফিরে আসা কিছু অস্পষ্ট হতে পারে এবং কলিং কোডটি তার উপর সিদ্ধান্ত নিতে পারে তবে পূর্বের কলটি রাষ্ট্রকে নিশ্চিত করবে।

এছাড়াও মনে রাখা, যত্ন ছাড়া ব্যবহৃত হলে যে নল বস্তু প্যাটার্ন মেমরি ক্ষুধার্ত হবে। এর জন্য - একটি NullObject এর উদাহরণ মালিকদের মধ্যে ভাগ করা উচিত, এবং এই প্রতিটি জন্য একটি একঘেয়ে উদাহরণ না।

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

অযৌক্তিক ফলাফল এড়ানোর জন্য এটি যেমন ক্ষেত্রে বিবেচনা মূল্য।


আমি চেষ্টা করেছি NullObjectPatternকিন্তু আমার জন্য সবসময় যেতে ভাল উপায় নয়। কখনও কখনও যখন "কোন কর্ম" appropiate হয় না।

NullPointerExceptionএকটি রানটাইম ব্যতিক্রম যা মানে এটি ডেভেলপারদের ত্রুটি এবং যথেষ্ট অভিজ্ঞতার সাথে এটি আপনাকে ঠিক কোথায় ত্রুটি বলে।

এখন উত্তর:

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

অবশ্যই, অভিজ্ঞতা এই পরামর্শ বুঝতে এবং প্রয়োগ করার জন্য আরও ভাল উপায়।

বাইট!


এই প্রশ্নটি জিজ্ঞাসা করে যে আপনি ত্রুটি পরিচালনা কৌশলগুলিতে আগ্রহী হতে পারেন। আপনার দলের আর্কিটেক্ট ত্রুটিগুলি কীভাবে কাজ করবেন তা নির্ধারণ করতে হবে। এই কাজ করার বিভিন্ন উপায় আছে:

  1. এক্সপেশেন্সগুলিকে তিড়িং লাফানোর অনুমতি দেয় - তাদেরকে 'মুখ্য লুপ' বা অন্য কোনও পরিচালনার রুটিনে ধরুন।

    • ত্রুটি অবস্থার জন্য চেক করুন এবং যথাযথভাবে তাদের হ্যান্ডেল

অবশ্যই, এপেক্ট ওরিয়েন্টেড প্রোগ্রামিং এও নজর রাখুন - if( o == null ) handleNull()আপনার বাইটকোডটিতে সন্নিবেশ করার জন্য তাদের সুস্পষ্ট পদ্ধতি রয়েছে ।


এটি প্রতিটি জাভা বিকাশকারীর জন্য একটি সাধারণ সমস্যা। তাই জাভা 8 এ আনুষ্ঠানিক সমর্থন নেই, এই সমস্যাগুলি সমাধান না করেই সমস্যাযুক্ত কোড।

জাভা 8 চালু হয়েছে java.util.Optional<T>। এটি একটি ধারক যা একটি অ-নল মান ধরে রাখতে পারে বা নাও থাকতে পারে। জাভা 8 এমন কিছু বস্তুর হ্যান্ডেল করার একটি নিরাপদ উপায় দিয়েছে যার মূল্য কয়েকটি ক্ষেত্রে অস্পষ্ট হতে পারে। এটা Haskell এবং Scala ধারণা থেকে অনুপ্রাণিত ।

সংক্ষেপে, ঐচ্ছিক শ্রেণীটিতে এমন কোনও পদ্ধতি রয়েছে যা কোনও মূল্য উপস্থিত বা অনুপস্থিত থাকলে তা স্পষ্টভাবে নিষ্পত্তি করার পদ্ধতি অন্তর্ভুক্ত করে। যাইহোক, নুল রেফারেন্সের তুলনায় সুবিধাটি হল যে ঐচ্ছিক <টি> বর্গ আপনাকে মানটির উপস্থিতির ক্ষেত্রে কেস সম্পর্কে চিন্তা করতে বাধ্য করে। ফলস্বরূপ, আপনি unintended নাল পয়েন্টার ব্যতিক্রম প্রতিরোধ করতে পারেন।

উপরের উদাহরণে আমাদের একটি হোম সার্ভিস ফ্যাক্টরি রয়েছে যা বাড়ীতে পাওয়া একাধিক যন্ত্রের জন্য হ্যান্ডেল ফেরত দেয়। কিন্তু এই পরিষেবাগুলি উপলব্ধ বা কার্যকরী হতে পারে নাও হতে পারে; এটি একটি NullPointerException ফলে হতে পারে। ifকোনও পরিষেবা ব্যবহার করার আগে একটি নিল অবস্থা যোগ করার পরিবর্তে, এটি ঐচ্ছিক <পরিষেবা> এ মোড়ানো যাক।

অপেক্ষারত <টি>

চলুন একটি কারখানা থেকে একটি সেবা একটি রেফারেন্স পেতে একটি পদ্ধতি বিবেচনা করা যাক। পরিবর্তে পরিষেবা রেফারেন্স ফেরত, এটি ঐচ্ছিক সঙ্গে মোড়ানো। এটি API ব্যবহারকারীকে জানাতে পারে যে ফেরত দেওয়া পরিষেবা উপলব্ধ / কার্যকরী নাও হতে পারে, নিরাপদে ব্যবহার করতে পারে

public Optional<Service> getRefrigertorControl() {
      Service s = new  RefrigeratorService();
       //...
      return Optional.ofNullable(s);
   }

আপনি দেখতে হিসাবে Optional.ofNullable()রেফারেন্স আবৃত পেতে একটি সহজ উপায় উপলব্ধ। ঐচ্ছিক রেফারেন্স পেতে অন্য উপায় আছে, হয় Optional.empty()& Optional.of()। নলটি পুনরুদ্ধার করার পরিবর্তে একটি খালি বস্তু ফেরত দেওয়ার জন্য এবং অন্যটি যথাক্রমে একটি নন-নুলেবল বস্তু মোড়ানো করার জন্য।

তাই কিভাবে এটি একটি সম্পূর্ণ চেক এড়াতে সাহায্য করে?

একবার আপনি একটি রেফারেন্স অবজেক্ট মোড়ানো হলে, ঐচ্ছিক এনপিই ছাড়াই মোড়ানো রেফারেন্সে পদ্ধতিগুলি আহ্বান করার জন্য অনেকগুলি কার্যকর পদ্ধতি সরবরাহ করে।

Optional ref = homeServices.getRefrigertorControl();
ref.ifPresent(HomeServices::switchItOn);

Optional.ifPresent একটি রেফারেন্স সহ প্রদত্ত গ্রাহককে যদি এটি একটি নন-নুল মান দেয়। অন্যথায়, এটা কিছুই না।

@FunctionalInterface
public interface Consumer<T>

একটি একক ইনপুট যুক্তি গ্রহণ করে এবং কোন ফলাফল প্রদান করে এমন একটি ক্রিয়াকলাপ উপস্থাপন করে। অন্যান্য কার্যকরী ইন্টারফেসের থেকে ভিন্ন, গ্রাহক পার্শ্ব প্রতিক্রিয়াগুলির মাধ্যমে কাজ করার প্রত্যাশিত। এটা এত পরিষ্কার এবং বুঝতে সহজ। উপরোক্ত কোড উদাহরণে, HomeService.switchOn(Service)ঐচ্ছিক হোল্ডিং রেফারেন্সটি যদি অ-নল থাকে তবে এটি প্রযোজ্য হয়।

আমরা নল অবস্থায় পরীক্ষা করার জন্য খুব প্রায়ই টার্নারি অপারেটর ব্যবহার করি এবং একটি বিকল্প মান বা ডিফল্ট মান প্রদান করি। ঐচ্ছিক নল চেক ছাড়া একই অবস্থা হ্যান্ডেল করার অন্য উপায় প্রদান করে। Optional.orEsese (defaultObj) ডিফল্ট Obj প্রদান করে যদি ঐচ্ছিক একটি নল মান থাকে। আসুন আমাদের নমুনা কোড এই ব্যবহার করুন:

public static Optional<HomeServices> get() {
    service = Optional.of(service.orElse(new HomeServices()));
    return service;
}

এখন HomeServices.get () একই জিনিস, কিন্তু একটি ভাল ভাবে। এটি পরিষেবাটি ইতোমধ্যে প্রাথমিকভাবে চালু হয়নি কিনা তা পরীক্ষা করে। এটি যদি আবার হয় তবে এটি একটি নতুন নতুন পরিষেবা তৈরি করে। ঐচ্ছিক <টি>। EElse (টি) একটি ডিফল্ট মান ফেরত দিতে সাহায্য করে।

অবশেষে, এখানে আমাদের NPE পাশাপাশি নিল চেক-ফ্রি কোড রয়েছে:

import java.util.Optional;
public class HomeServices {
    private static final int NOW = 0;
    private static Optional<HomeServices> service;

public static Optional<HomeServices> get() {
    service = Optional.of(service.orElse(new HomeServices()));
    return service;
}

public Optional<Service> getRefrigertorControl() {
    Service s = new  RefrigeratorService();
    //...
    return Optional.ofNullable(s);
}

public static void main(String[] args) {
    /* Get Home Services handle */
    Optional<HomeServices> homeServices = HomeServices.get();
    if(homeServices != null) {
        Optional<Service> refrigertorControl = homeServices.get().getRefrigertorControl();
        refrigertorControl.ifPresent(HomeServices::switchItOn);
    }
}

public static void switchItOn(Service s){
         //...
    }
}

সম্পূর্ণ পোস্ট এনপিই এবং পাশাপাশি নুল চেক-ফ্রি কোড ... সত্যিই?


জাভা 7 একটি নতুন java.util.Objectsইউটিলিটি ক্লাস আছে যা একটি requireNonNull()পদ্ধতি আছে। NullPointerExceptionএটির যুক্তিটি যদি নাল হয় তবে এটি সমস্ত একটি নিক্ষেপ করে , তবে এটি কোডটিকে কিছুটা পরিষ্কার করে। উদাহরণ:

Objects.requireNonNull(someObject);
someObject.doCalc();

কনস্ট্রাক্টরের একটি অ্যাসাইনমেন্টের ঠিক আগে এটি checking করার জন্য পদ্ধতিটি সবচেয়ে কার্যকর , যেখানে এর প্রতিটি ব্যবহার কোডের তিনটি লাইন সংরক্ষণ করতে পারে:

Parent(Child child) {
   if (child == null) {
      throw new NullPointerException("child");
   }
   this.child = child;
}

হয়ে

Parent(Child child) {
   this.child = Objects.requireNonNull(child, "child");
}

নাল একটি 'সমস্যা' নয়। এটি একটি complete মডেলিং টুল সেট একটি অবিচ্ছেদ্য অংশ । সফটওয়্যারটি বিশ্বের জটিলতার মডেল এবং নল বহন করে বোঝায়। নল জাভা এবং অনুরূপ 'কোন তথ্য' বা 'অজানা' নির্দেশ করে । সুতরাং এই উদ্দেশ্যে এই nulls ব্যবহার করা উপযুক্ত। আমি 'নুল অবজেক্ট' প্যাটার্ন পছন্দ করি না; আমি মনে করি এটি ' অভিভাবকদের সমস্যা রক্ষা করবে কে '।
যদি আপনি আমাকে জিজ্ঞাসা করেন আমার বান্ধবী নাম কি, আমি আপনাকে বলব যে আমার কোন বান্ধবী নেই। জাভা ভাষায় আমি নাল ফিরে আসব। কোনও বিকল্প এমন কিছু সমস্যা নির্দেশ করার অর্থপূর্ণ ব্যতিক্রম নিক্ষেপ করা হবে যা হতে পারে না (অথবা 'টি হতে চান) ঠিক আছে এবং ব্যবহারকারীর কাছে ডেটা অ্যাক্সেস ত্রুটি পুনরায় চেষ্টা বা স্ট্যাকের জন্য এটি কোথাও উচ্চতর প্রতিনিধিত্ব করে।

  1. একটি 'অজানা প্রশ্ন' জন্য 'অজানা উত্তর' দিতে। (এটি ব্যবসা-বিন্দু দৃষ্টিকোণ থেকে সঠিক যেখানে এটি অসীম-নিরাপদ হোন) ব্যবহারের আগে একাধিক কলারগুলিকে কল করার আগে তাদের চেক করার আগে একটি পদ্ধতির ভিতরে একবার নল জন্য আর্গুমেন্ট পরীক্ষা করে।

    public Photo getPhotoOfThePerson(Person person) {
        if (person == null)
            return null;
        // Grabbing some resources or intensive calculation
        // using person object anyhow.
    }
    

    আমার ফটো লাইব্রেরি থেকে একটি অস্তিত্বহীন বান্ধবী কোন ছবি পেতে স্বাভাবিক যুক্তি প্রবাহ পূর্ববর্তী বাড়ে।

    getPhotoOfThePerson(me.getGirlfriend())
    

    এবং এটি নতুন আসছে জাভা API এর সাথে সামঞ্জস্যপূর্ণ (অপেক্ষমান)

    getPhotoByName(me.getGirlfriend()?.getName())
    

    যদিও এটি 'স্বাভাবিক ব্যবসায় প্রবাহ' তবে কিছু ব্যক্তির জন্য ডিবিতে সংরক্ষিত ফটো খুঁজে পাওয়া যায় না, আমি অন্য কিছু ক্ষেত্রে নীচের মতো জোড়া ব্যবহার করতে ব্যবহার করতাম

    public static MyEnum parseMyEnum(String value); // throws IllegalArgumentException
    public static MyEnum parseMyEnumOrNull(String value);
    

    এবং টাইপ করতে ঘৃণা করবেন না <alt> + <shift> + <j>(Eclipse এ javadoc জেনারেট করুন) এবং আপনার জন্য পাবলিক এপিআই তিনটি অতিরিক্ত শব্দ লিখুন। এই সমস্ত যারা কিন্তু ডকুমেন্টেশন পড়তে না জন্য যথেষ্ট বেশী হবে।

    /**
     * @return photo or null
     */
    

    অথবা

    /**
     * @return photo, never null
     */
    
  2. এটি বরং তাত্ত্বিক ক্ষেত্রে এবং বেশিরভাগ ক্ষেত্রে আপনাকে জাভা নাল নিরাপদ API (যদি এটি অন্য 10 বছরের মধ্যে মুক্তি দেওয়া হয়) পছন্দ করা উচিত তবে NullPointerExceptionএটি একটি উপশ্রেণী Exceptionসুতরাং এটি একটি ফর্ম Throwableযা একটি যুক্তিসঙ্গত অ্যাপ্লিকেশন ধরা পেতে পারে ( javadoc ) নির্দেশ করে যে অবস্থা ! ব্যতিক্রমগুলির প্রথম সর্বাধিক সুবিধা এবং 'নিয়মিত' কোড থেকে পৃথক ত্রুটি-হ্যান্ডলিং কোডটি ব্যবহার করার জন্য ( জাভা নির্মাতাদের মতে ) আমার পক্ষে এটি ধরা উপযুক্ত NullPointerException

    public Photo getGirlfriendPhoto() {
        try {
            return appContext.getPhotoDataSource().getPhotoByName(me.getGirlfriend().getName());
        } catch (NullPointerException e) {
            return null;
        }
    }
    

    প্রশ্ন উঠতে পারে:

    প্রশ্নঃ যদি getPhotoDataSource()ফিরে নালা না হয়?
    উ। এটা ব্যবসা যুক্তি পর্যন্ত। যদি আমি কোন ফটো অ্যালবাম খুঁজে না পাই তবে আমি আপনাকে কোন ছবি দেখাবো না। যদি অ্যাপকোন্টেক্সটি চালু না হয় তবে কী হবে? এই পদ্ধতির ব্যবসায়িক যুক্তি এই সঙ্গে রাখে। যদি একই যুক্তি আরো কঠোর হওয়া উচিত তবে একটি ব্যতিক্রম নিক্ষেপ করা এটি ব্যবসায়িক যুক্তি এবং নলটির জন্য স্পষ্ট চেক ব্যবহার করা উচিত (কেস 3)। নতুন জাভা নাল-নিরাপদ এপিআই বেছে বেছে নির্দিষ্ট করতে এখানে ভাল ফিট কি বুঝানো এবং কি সক্রিয়া করা পরোক্ষভাবে না ব্যর্থ-ফাস্ট প্রোগ্রামার ত্রুটি ক্ষেত্রে যাবে।

    প্রঃ রিডান্ডান্ট কোডটি কার্যকর করা যেতে পারে এবং অপ্রয়োজনীয় সংস্থানগুলি ধরতে পারে।
    এটি getPhotoByName()একটি ডাটাবেস সংযোগ খুলতে চেষ্টা করবে, যদি PreparedStatementশেষ পর্যন্ত এসকিউএল প্যারামিটার হিসাবে ব্যক্তি নাম তৈরি এবং ব্যবহার করতে পারে। একটি অজানা প্রশ্নের জন্য পদ্ধতি একটি অজানা উত্তর দেয় (কেস 1) এখানে কাজ করে। সংস্থান দখল করার আগে পদ্ধতিটি পরামিতি পরীক্ষা করে এবং প্রয়োজনে 'অজানা' ফলাফলটি ফেরত দিতে হবে।

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

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

    public SomeValue calculateSomeValueUsingSophisticatedLogic(Predicate predicate) {
        try {
            Result1 result1 = performSomeCalculation(predicate);
            Result2 result2 = performSomeOtherCalculation(result1.getSomeProperty());
            Result3 result3 = performThirdCalculation(result2.getSomeProperty());
            Result4 result4 = performLastCalculation(result3.getSomeProperty());
            return result4.getSomeProperty();
        } catch (NullPointerException e) {
            return null;
        }
    }
    
    public SomeValue calculateSomeValueUsingSophisticatedLogic(Predicate predicate) {
        SomeValue result = null;
        if (predicate != null) {
            Result1 result1 = performSomeCalculation(predicate);
            if (result1 != null && result1.getSomeProperty() != null) {
                Result2 result2 = performSomeOtherCalculation(result1.getSomeProperty());
                if (result2 != null && result2.getSomeProperty() != null) {
                    Result3 result3 = performThirdCalculation(result2.getSomeProperty());
                    if (result3 != null && result3.getSomeProperty() != null) {
                        Result4 result4 = performLastCalculation(result3.getSomeProperty());
                        if (result4 != null) {
                            result = result4.getSomeProperty();
                        }
                    }
                }
            }
        }
        return result;
    }
    

    PPS। দ্রুতগতির জন্য যারা (এবং ডকুমেন্টেশন পড়া খুব দ্রুত নয়) আমি বলতে চাই যে আমি কখনোই আমার জীবনে একটি নল-পয়েন্টার ব্যতিক্রম (এনপিই) ধরিনি। কিন্তু এই সম্ভাবনা ইচ্ছাকৃতভাবে জাভা নির্মাতাদের দ্বারা ডিজাইন করা হয়েছে কারণ এনপিই একটি উপশ্রেণী Exception। যখন আমি জাভা ইতিহাসে একটি নজির আছে ThreadDeathএকটি হল Error, কারণ এটি আসলে একটি অ্যাপ্লিকেশন ত্রুটি নয়, কিন্তু একমাত্র কারণ এটি ধরা হতে উদ্দেশ্যে না হয়! কত NPE একটি হতে ফিট Errorচেয়ে ThreadDeath! কিন্তু এটা না।

  3. ব্যবসায়ের লজিকের ইঙ্গিত থাকলে কেবল 'কোনও তথ্য নেই' এর জন্য পরীক্ষা করুন।

    public void updatePersonPhoneNumber(Long personId, String phoneNumber) {
        if (personId == null)
            return;
        DataSource dataSource = appContext.getStuffDataSource();
        Person person = dataSource.getPersonById(personId);
        if (person != null) {
            person.setPhoneNumber(phoneNumber);
            dataSource.updatePerson(person);
        } else {
            Person = new Person(personId);
            person.setPhoneNumber(phoneNumber);
            dataSource.insertPerson(person);
        }
    }
    

    এবং

    public void updatePersonPhoneNumber(Long personId, String phoneNumber) {
        if (personId == null)
            return;
        DataSource dataSource = appContext.getStuffDataSource();
        Person person = dataSource.getPersonById(personId);
        if (person == null)
            throw new SomeReasonableUserException("What are you thinking about ???");
        person.setPhoneNumber(phoneNumber);
        dataSource.updatePerson(person);
    }
    

    যদি AppContext বা ডেটাসোর্স অনাহূত রানটাইম প্রারম্ভিক না হয় তবে NullPointerException বর্তমান থ্রেডকে হত্যা করবে এবং থ্রেড. Thread.defaultUncaughtExceptionHandler দ্বারা প্রক্রিয়াকরণ করা হবে (আপনার পছন্দসই লগার বা অন্যান্য বিজ্ঞপ্তি মেকানিজম সংজ্ঞায়িত এবং ব্যবহার করার জন্য)। যদি সেট না করা হয়, ThreadGroup#uncaughtException সিস্টেম ThreadGroup#uncaughtException মুদ্রণ করবে। এক অ্যাপ্লিকেশন ত্রুটি লগ নিরীক্ষণ করা উচিত এবং প্রতিটি unhandled ব্যতিক্রম জন্য Jira সমস্যা খুলতে হবে যা আসলে অ্যাপ্লিকেশন ত্রুটি। প্রোগ্রামার শুরু স্টাফ কোথাও বাগ ঠিক করা উচিত।


সম্ভবত জাভা 8 বা তার জন্য সর্বোত্তম বিকল্প হল Optionalক্লাস ব্যবহার করা ।

Optional stringToUse = Optional.of("optional is there");
stringToUse.ifPresent(System.out::println);

এই সম্ভাব্য নল মান দীর্ঘ শৃঙ্খল জন্য বিশেষত সহজ। উদাহরণ:

Optional<Integer> i = Optional.ofNullable(wsObject.getFoo())
    .map(f -> f.getBar())
    .map(b -> b.getBaz())
    .map(b -> b.getInt());

নল উপর ব্যতিক্রম নিক্ষেপ কিভাবে উদাহরণ:

Optional optionalCarNull = Optional.ofNullable(someNull);
optionalCarNull.orElseThrow(IllegalStateException::new);

জাভা 7 এমন Objects.requireNonNullপদ্ধতিটি চালু করেছে যা নন-নুলেশনের জন্য কিছু চেক করার সময় সহজ হতে পারে। উদাহরণ:

String lowerVal = Objects.requireNonNull(someVar, "input cannot be null or empty").toLowerCase();

public static <T> T ifNull(T toCheck, T ifNull) {
    if (toCheck == null) {
           return ifNull;
    }
    return toCheck;
}




null