উদাহরণস্বরূপ ফোন করার আগে নাল চেক দরকার?


1354

null instanceof SomeClassফিরবে falseনাকি নিক্ষেপ করবে NullPointerException?


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

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

উত্তর:


1838

না, উদাহরণ ব্যবহারের আগে নাল চেকের দরকার নেই।

অভিব্যক্তি x instanceof SomeClassহয় falseযদি xহয় null

জাভা ভাষার উল্লেখ থেকে, বিভাগ 15.20.2, "তুলনা অপারেটর উদাহরণ টাইপ করুন" :

"চলাকালীন সময়ে, instanceofঅপারেটরের ফলাফল trueযদি রিলেশনালএক্সপ্রেসনের মান না হয়null এবং রেফারেন্সটি টাইপ না করে রেফারেন্সটাইপটিতে কাস্ট করা যেতে পারে ClassCastException। অন্যথায় ফলাফল হয় false।"

অপারেন্ডটি যদি নাল হয় তবে ফলাফলটি মিথ্যা।


377
এই উত্তরটি তার চেয়ে বেশি সঠিক try itকারণ বর্তমান আচরণ গ্যারান্টিযুক্ত আচরণের মতো নয় ।
লুক

3
এই প্রশ্নটি বস্তুগত সমতার বিষয়ে জোশুয়া ব্লচের অধ্যায়ের সময় কার্যকর হয়েছিল Effective Java- amazon.com/Effective-Java-Edition- জোশুয়া- ব্লাচ
কেভিন মেরেডিথ

17
বিশেষত, আইটেম 8-এ, তিনি নোট করেছেন যে সমান () পদ্ধতিতে, একটি উদাহরণস্বরূপ অপারেটর দুটি উদ্দেশ্যে কাজ করে - এটি যাচাই করে যে যুক্তিটি নন এবং সঠিক ধরণের উভয়ই। "... [এস] ও আপনার আলাদা নাল চেকের দরকার নেই।"
অ্যান্ডি টমাস

2
@ বেনথর্লি - জাভা instanceofঅপারেটর জাভা 1.0 এর অংশ ছিল, প্রায় 20 বছর আগে মুক্তি পেয়েছিল। বিদ্যমান কোডটি ভেঙে এমনভাবে আচরণটি এখন পরিবর্তন করা অসম্ভব, কিছু সুবিধার অনুপস্থিত যা এই বিশাল ব্যয়কে ছাড়িয়ে যায়। বিশ বছর আগে, যদি সত্য যুক্তি দেওয়া যেতে পারে তবে যুক্তিটি সত্য হতে পারে, বা নাল যুক্তির ব্যতিক্রম ছুঁড়তে পারে। তবে এই সংজ্ঞাগুলির জন্য পৃথক নাল চেকের প্রয়োজন হত।
অ্যান্ডি টমাস

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

267

instanceofফেরতের প্রথম অপারেন্ড হিসাবে নাল রেফারেন্স ব্যবহার করে false


268
(এবং এখন গুগলে এই প্রশ্নটি পেতে 10 সেকেন্ড সময় লাগবে)
PL_kolek

73

সত্যিই খুব ভাল প্রশ্ন। আমি শুধু নিজের জন্য চেষ্টা করেছি।

public class IsInstanceOfTest {

    public static void main(final String[] args) {

        String s;

        s = "";

        System.out.println((s instanceof String));
        System.out.println(String.class.isInstance(s));

        s = null;

        System.out.println((s instanceof String));
        System.out.println(String.class.isInstance(s));
    }
}

ছাপে

true
true
false
false

জেএলএস / 15.20.2। তুলনা অপারেটর উদাহরণ টাইপ করুন

চলাকালীন সময়ে instanceofঅপারেটরের ফলাফল trueযদি রিলেশনালএক্সপ্রেসের মান না হয় nullএবং রেফারেন্সটি টাইপ না করে রেফারেন্স টাইপ করা যায় ClassCastException। অন্যথায় ফলাফল হয় false

এপিআই / ক্লাস # ইন্সট্যান্স (অবজেক্ট)

যদি এই Classঅবজেক্টটি একটি ইন্টারফেসের প্রতিনিধিত্ব করে, trueশ্রেণি বা নির্দিষ্ট Objectআর্গুমেন্টের কোনও সুপারক্লাস এই ইন্টারফেসটি প্রয়োগ করে যদি এই পদ্ধতিটি ফিরে আসে ; এটি falseঅন্যথায় ফিরে আসে । যদি এই Classবস্তুটি কোনও আদিম ধরণের প্রতিনিধিত্ব করে তবে এই পদ্ধতিটি ফিরে আসে false


ধরণের বিভ্রান্তি। s একটি স্ট্রিং কারণ এটি "স্ট্রিং s" বলে, এটি একটি স্ট্রিং নয় কারণ এটি নাল। তাহলে আর কী?
কাই ওয়াং

1
@ কাইওয়াং sকেবল একটি অবজেক্ট রেফারেন্স ভেরিয়েবল। এটি একটি বিদ্যমান বিদ্যমান অবজেক্ট ( "") উল্লেখ করতে পারে বা এটি একটি (দ্য) nullআক্ষরিক উল্লেখ উল্লেখ করতে পারে।
জিন কওন

আমি এখনও বিভ্রান্ত s এখন শূন্য হতে পারে, তবে এটি কেবল পরে একটি স্ট্রিং উদাহরণের দিকে নির্দেশ করা যেতে পারে। এটি একটি পূর্ণসংখ্যার মতো ইশারা করা যায় না। সুতরাং এটি এখনও একটি স্ট্রিং ধরণের, এমনকি এটি একটি নাল। খুব বেশি কিছু বোঝায় না ...
কাই ওয়াং

@ কাইওয়্যাং আপনি ভেরিয়েবল টাইপটিকে আসল অবজেক্টের ধরণের সাথে বিভ্রান্ত করছেন। চলক উদাহরণস্বরূপ নয়; তারা কার্যকরভাবে কেবল পয়েন্টার। nullস্ট্রিং ডেটা নয়, ভেরিয়েবল এটি কীভাবে দেখায় তা বিবেচনা করে না। উদাহরণস্বরূপ s instanceof Stringহিসাবে একই নয় field.getType().equals(String.class)
ম্যাথু

@KaiWang আপনি কল্পনা যে কলে আছে , প্রকৃত মূল্য দিয়ে প্রতিস্থাপিত পরার যাতে হয়ে এবং । এটি সম্পর্কে এইভাবে চিন্তা করা আরও বোধগম্য হতে পারে। s instanceof Strings"" instanceof Stringnull instanceof String
টিমো টারস্কম্যান 17

24

না এইটা না. এটির প্রথম অপারেন্ড instanceofহলে ফিরে falseআসবে null


16

ঠিক একটি জালিয়াতি হিসাবে :

এমনকি ফিরে আসবে ।(((A)null)instanceof A)false


(যদি টাইপকাস্টিং nullআশ্চর্যজনক মনে হয়, কখনও কখনও আপনাকে এটি করতে হয়, উদাহরণস্বরূপ পরিস্থিতিতে যেমন:

public class Test
{
  public static void test(A a)
  {
    System.out.println("a instanceof A: " + (a instanceof A));
  }

  public static void test(B b) {
    // Overloaded version. Would cause reference ambiguity (compile error)
    // if Test.test(null) was called without casting.
    // So you need to call Test.test((A)null) or Test.test((B)null).
  }
}

সুতরাং Test.test((A)null)মুদ্রণ করবে a instanceof A: false।)


পিএস: আপনি যদি ভাড়া নিচ্ছেন তবে দয়া করে এটিকে কাজের সাক্ষাত্কারের প্রশ্ন হিসাবে ব্যবহার করবেন না। : ডি


7

কোন । জাভা আক্ষরিক nullকোনও শ্রেণীর উদাহরণ নয়। সুতরাং এটি কোনও শ্রেণীর উদাহরণ হতে পারে না । instanceof পারেন ফিরে আসবে falseবাtrue তাই <referenceVariable> instanceof <SomeClass>আয় falseযখন referenceVariableমান নাল।


5
এই ব্যাখ্যাটি অদ্ভুতভাবে বিজ্ঞপ্তিযুক্ত মনে হচ্ছে ... তবে আমি আপনাকে কী বলতে চাই তা জানি :-)
ক্রিস

@ ক্রিস টাই মন্তব্যটির জন্য আপনি যা বলতে চেয়েছিলেন তা পেয়েছি :)। একটি উত্তর কিছুটা সম্পাদনা করেছেন :)।
বিকাশকারী মারিয়াস Žilasnas

1

instanceofঅপারেটর স্পষ্ট দরকার নেই null, চেক যেমন নিক্ষেপ করে না NullPointerExceptionপ্রতীক হলে null

চলাকালীন সময়ে, instanceofঅপারেটরের ফলাফলটি সত্য যদি আপেক্ষিক অভিব্যক্তির মান না হয় nullএবং শ্রেণি castালাই ব্যতিক্রম না বাড়িয়ে রেফারেন্সটি রেফারেন্সের ধরণে দেওয়া যেতে পারে।

যদি অপারেন্ড হয় nullতবে instanceofঅপারেটর ফিরে আসে falseএবং তাই সুস্পষ্ট নাল চেকের প্রয়োজন হয় না।

নীচের উদাহরণটি বিবেচনা করুন,

public static void main(String[] args) {
         if(lista != null && lista instanceof ArrayList) {                     //Violation
                System.out.println("In if block");
         }
         else {
                System.out.println("In else block");
         }
}

এর সঠিক ব্যবহার instanceofনীচে দেখানো হয়েছে,

public static void main(String[] args) {
      
         if(lista instanceof ArrayList){                     //Correct way
                  System.out.println("In if block");
         }
            else {
                 System.out.println("In else block");
         }  
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.