স্যুইচ-এ নাল কীভাবে ব্যবহার করবেন


202
Integer i = ...

switch (i){
    case null:
        doSomething0();
        break;    
    }

উপরের কোডে আমি সুইচ কেস স্টেটমেন্টে নাল ব্যবহার করতে পারছি না। আমি কীভাবে এটি অন্যভাবে করতে পারি? আমি ব্যবহার করতে পারি না defaultকারণ তখন আমি অন্য কিছু করতে চাই।


9
স্যুইচ করার আগে নাল কন্ডিশনের জন্য চেক করুন যদি (i == নাল) {//
ডোজোমথিং

8
এটি আসলে স্যুইচকে দরকারী করে তুলবে। অন্যান্য প্যাটার্নের সাথে মিলে যায় এমন ভাষা work
পাইরোলিস্টিকাল

উত্তর:


276

switchজাভাতে একটি বিবৃতি দিয়ে এটি সম্ভব নয় । এর nullআগে পরীক্ষা করুন switch:

if (i == null) {
    doSomething0();
} else {
    switch (i) {
    case 1:
        // ...
        break;
    }
}

আপনি নির্বিচারে বস্তু ব্যবহার করতে পারবেন না switchবিবৃতি * । কারণ কম্পাইলার সম্পর্কে অভিযোগ নেই switch (i)যেখানে iএকটি হল Integerজাভা স্বয়ংক্রিয় unboxes কারণ Integerএকটি থেকে int। Asylias ইতিমধ্যে বলেছে যে, আনবক্সিং NullPointerExceptionযখন iহয় তখন ফেলে দেবে null

* জাভা 7 যেহেতু Stringআপনি switchবিবৃতিতে ব্যবহার করতে পারেন ।

ওরাকল ডক্স - স্যুইচ এ আরও সম্পর্কে switch(নাল ভেরিয়েবল সহ উদাহরণ সহ) More


16
আপনি সুইচ স্টেটমেন্টগুলিতে এনাম ব্যবহার করতে পারেন।
জোরিকি

27
এটি বোধগম্য হয় যে আপনি আনবক্সিংয়ের কারণে নাল পূর্ণসংখ্যা বা অন্যান্য র‍্যাপার ক্লাস ব্যবহার করতে পারবেন না। তবে এনাম এবং স্ট্রিং সম্পর্কে কী বলা যায়? কেন তারা নাল হতে পারে না?
লুয়ান নিকো

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

3
@ রিমিয়াস আপনাকে সর্বদা নাল চেক করতে হবে না। আপনি যদি আপনার পদ্ধতিগুলিতে যে কোড কোডগুলি দেন তা আপনি যদি সম্মান করেন তবে আপনি প্রায় সর্বদা আপনার কোড নাল চেক দিয়ে বিশৃঙ্খলা না করে পরিচালনা করতে পারেন। যদিও জরিপগুলি ব্যবহার করা সর্বদা দুর্দান্ত।
জোফ্রে

আমি @ লুয়াননিকো এর প্রশ্নের উত্তর জানতে চাই। এটি অযৌক্তিক বলে মনে হয় যা nullকাজ করে Stringএবং enumপ্রকারের সময় বৈধ কেস হতে পারে না । সম্ভবত enumবাস্তবায়ন ordinal()পর্দার পিছনে কল করার উপর নির্ভর করে (যদিও তারপরেও null-1 এর 'অর্ডিনাল' বলে বিবেচনা করা হয় না ) এবং Stringসংস্করণটি ব্যবহার করে intern()এবং নির্দেশক-তুলনা করে কিছু করে তোলে (বা অন্যথায় এমন কিছু বিষয়কে নির্ভর করে যা দৃ strictly়ভাবে ডিফারেন্সিং প্রয়োজন অবজেক্ট)?
অ্যারথ


40

switch(i)যদি আমি একটি নালপয়েন্টারএক্সেপশন নিক্ষেপ করা হবে null, কারণ এটি unbox করতে চেষ্টা করবে Integerএকটি মধ্যে int। সুতরাংcase null , যা অবৈধ বলে মনে হয় তা কখনই পৌঁছাতে পারত না।

আপনার যাচাই করা দরকার যে switchবিবৃতি দেওয়ার আগে আমি নালাম না ।


23

জাভা ডক্স পরিষ্কারভাবে বলেছে যে:

একটি স্যুইচ লেবেল হিসাবে নাল ব্যবহারের বিরুদ্ধে নিষেধাজ্ঞা এমন কোনও কোড লেখা থেকে বাধা দেয় যা কখনই কার্যকর করা যায় না। যদি স্যুইচ এক্সপ্রেশনটি কোনও রেফারেন্স ধরণের হয়, যেমন একটি বক্সযুক্ত আদিম প্রকার বা এনুম, এক্সপ্রেশনটি রান-টাইমে শূন্য করার জন্য মূল্যায়ন করে তবে রান-টাইম ত্রুটি ঘটবে।

সুইচ স্টেটমেন্ট কার্যকর করার আগে আপনাকে অবশ্যই নাল যাচাই করতে হবে।

if (i == null)

দেখুন সুইচ বিবৃতি

case null: // will never be executed, therefore disallowed.

1
আপনার লিঙ্কের জাভাদোকরা আর "নালটিকে একটি স্যুইচ লেবেল [ইত্যাদি] হিসাবে ব্যবহারের বিরুদ্ধে নিষেধাজ্ঞান" বলে না।
প্যাট্রিক এম


14

প্রদত্ত:

public enum PersonType {
    COOL_GUY(1),
    JERK(2);

    private final int typeId;
    private PersonType(int typeId) {
        this.typeId = typeId;
    }

    public final int getTypeId() {
        return typeId;
    }

    public static PersonType findByTypeId(int typeId) {
        for (PersonType type : values()) {
            if (type.typeId == typeId) {
                return type;
            }
        }
        return null;
    }
}

আমার জন্য, এটি সাধারণত একটি ডাটাবেসে লুক-আপ টেবিলের সাথে একত্রিত হয় (কেবলমাত্র খুব কম আপডেট হওয়া টেবিলের জন্য)।

যাইহোক, যখন আমি findByTypeIdএকটি স্যুইচ বিবৃতিতে ব্যবহার করার চেষ্টা করি (সম্ভবত, ব্যবহারকারী ইনপুট) ...

int userInput = 3;
PersonType personType = PersonType.findByTypeId(userInput);
switch(personType) {
case COOL_GUY:
    // Do things only a cool guy would do.
    break;
case JERK:
    // Push back. Don't enable him.
    break;
default:
    // I don't know or care what to do with this mess.
}

... অন্যরা যেমন বলেছে, এটি এনপিইতে @ ফলাফল করে switch(personType) {। একটি কাজের আশেপাশে (অর্থাত্ "সমাধান") আমি প্রয়োগ করতে শুরু করি তা হল একটি UNKNOWN(-1)প্রকার যুক্ত করা।

public enum PersonType {
    UNKNOWN(-1),
    COOL_GUY(1),
    JERK(2);
    ...
    public static PersonType findByTypeId(int id) {
        ...
        return UNKNOWN;
    }
}

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


2
UNKNOWNআমি এর আগে কখনও দেখেছি এবং ওভার কমস নালচেকস এর সর্বোত্তম সমাধান।
membersound

5

আপনি একটি করতে হবে

if (i == null) {
   doSomething0();
} else {
   switch (i) {
   }
}

4

কিছু গ্রন্থাগার বিল্টিন জাভা switchবিবৃতিতে বিকল্প প্রস্তাব দেওয়ার চেষ্টা করে । ভিভর তাদের মধ্যে একটি, তারা একে প্যাটার্ন মেলানোর ক্ষেত্রে সাধারণীকরণ করে।

এখানে তাদের ডকুমেন্টেশন থেকে একটি উদাহরণ :

String s = Match(i).of(
    Case($(1), "one"),
    Case($(2), "two"),
    Case($(), "?")
);

আপনি যে কোনও প্রাক্টিকেট ব্যবহার করতে পারেন তবে তারা তাদের মধ্যে অনেকগুলি বাক্সের বাইরেই অফার করেন এবং $(null)এটি পুরোপুরি আইনী। আমি বিকল্পগুলির চেয়ে এটি আরও মার্জিত সমাধান খুঁজে পাই, তবে এর জন্য জাভা 8 এবং ভ্যাব্রের লাইব্রেরিতে নির্ভরতা প্রয়োজন ...




0

আপনি পারবেন না। আপনি সুইচটিতে আদিম (অন্তর্নির্মিত, চর, সংক্ষিপ্ত, বাইট) এবং স্ট্রিং (জাভা St স্ট্রিংস) ব্যবহার করতে পারেন। আদিমগুলি নালার হতে পারে না। স্যুইচ করার আগে পৃথক অবস্থায়
চেক করুন i


4
আপনি enums ব্যবহার করতে পারেন।
করু

5
এনাম যদি নাল হয় তবে আপনারও একই সমস্যা হবে। বিটিডাব্লু, এটি বেশ আশ্চর্যজনক যে স্যুইচটি নাল পরিচালনা করতে পারে না, কারণ এটির একটি ডিফল্ট ধারা রয়েছে

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

2
আমি মনে করি তার ডিফল্ট ধারাটি অন্য কোনও সম্ভাব্য এনাম মান হিসাবে নাল পরিচালনা করবে যা আগের মামলার দ্বারা ধরা পড়ে নি
লিও

0

সুইচ কীভাবে কাজ করতে পারে তা বিবেচনা করুন,

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

0

জাভা 8 সহ @tetsuo উত্তরের উপর ভিত্তি করে:

Integer i = ...

switch (Optional.ofNullable(i).orElse(DEFAULT_VALUE)) {
    case DEFAULT_VALUE:
        doDefault();
        break;    
}
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.