নাল বুলিয়ান ব্যতিক্রমের সত্য ফলাফল কিনা তা পরীক্ষা করুন


169

আমার কাছে নিম্নলিখিত কোড রয়েছে:

Boolean bool = null;

try 
{
    if (bool)
    {
        //DoSomething
    }                   
} 
catch (Exception e) 
{
    System.out.println(e.getMessage());             
}

আমার বুলিয়ান ভেরিয়েবল "বুল" এ কেন চেক আপ করা যায় তার ব্যতিক্রম? এটি যদি সত্য হয় না তখন এটি "দেখায়" যখন বিবৃতিটি ঠিক পেরে যায় না? আমি যখন বিবৃতিটি সরিয়ে ফেলি বা এটি শূন্য হয় না তা পরীক্ষা করে দেখি, ব্যতিক্রমটি চলে যায়।


3
অবজেক্ট আনবক্সিং সম্পর্কে উপরের উত্তরগুলি সমস্ত সঠিক। সম্পূর্ণতার জন্য, তবে আপনি নিজের কোডটি পরিবর্তনের জন্য বস্তুর মোড়ক "বুলিয়ান" এর পরিবর্তে আদিম "বুলিয়ান" ব্যবহার করতে পারেন। আদিম এবং একটি বস্তুর মধ্যে পার্থক্য সম্পর্কেও নিজেকে সতেজ করা উচিত।
মারভো

এদিকে ... if (bool == Boolean.TRUE)একটি ব্যতিক্রম ব্যতীত মিথ্যা মূল্যায়ন করে। আমি সবেমাত্র পাওয়া ক্ষেত্রে এটি ইচ্ছাকৃত ছিল কিনা তা নিশ্চিত নয়।
সাইমন.ওয়াটস

2
@ simon.watts যে জন্য মিথ্যা হবে boolহচ্ছে nullঅথবা যদি Boolean(রেফারেন্স হিসাবে এবং স্পষ্টভাবে নির্মাণ করা হয়েছিল Boolean.TRUE)। সুতরাং প্রস্তাবিত নয়; if (Boolean.TRUE.equals(bool))যার বিপরীতে সুরক্ষিতভাবে হ্যান্ডলিং nullমান সহ প্রত্যাশা অনুযায়ী কাজ করবে ।
স্টেক্সম্যান

উত্তর:


171

আপনার যখন booleanএটি থাকে তা হয় trueবা হয়ও false। তবুও আপনার যখন Booleanএটি থাকে তা হয় হয় Boolean.TRUE, Boolean.FALSEবা nullঅন্য কোনও বিষয় হিসাবেও হতে পারে ।

আপনার নির্দিষ্ট ক্ষেত্রে, আপনার Booleanহয় nullএবং ifবিবৃতি একটি অন্তর্নিহিত রূপান্তর আরম্ভ করে booleanযে উত্পাদন করে NullPointerException। পরিবর্তে আপনার প্রয়োজন হতে পারে:

if(bool != null && bool) { ... }

23
প্রযুক্তিগতভাবে Booleanসত্যিকারের কোনও উদাহরণ হতে পারে না Boolean.TRUE। উদাহরণস্বরূপ new Boolean(true)
স্টিভ কুও

1
আমি বুঝতে চেষ্টা করি যে কেন if (myBoolean)(যেখানে myBooleanরয়েছে Boolean) সংকলক ত্রুটি বা কমপক্ষে কোনও সতর্কতা বাড়ায় না। এটি নিশ্চিতভাবে একটি গেটচা।
জোশ এম

1
@JoshM। এর কারণ হল জাভা নেই বক্সিং এবং আনবক্সিং : চাদরে এর docs.oracle.com/javase/tutorial/java/data/autoboxing.html
Vinicius

3
@ ভিনিসিয়াস নিশ্চিত, তবে কমপায়ার সংকেতটি অন্তত কমপ্লেক্সের মাধ্যমে সংকলকটি এই ক্ষেত্রে আমাদের পক্ষে শূন্য করতে হবে।
জোশ এম।

2
@JoshM। আরও একমত হতে পারে না :)
ভিনিসিয়াস

402

আপনি যদি অতিরিক্ত নাল চেকগুলি পছন্দ না করেন:

if (Boolean.TRUE.equals(value)) {...}

1
@ অ্যাভ্রাড্রাগন: সমান কি দরকার? অপারেটর == এখানে কাজ করে যেহেতু বুলিয়ানটির কেবল দুটি মান রয়েছে
অতুল

7
@ অতুল হ্যাঁ, এখানে সমান প্রয়োজন। কারণ (নতুন বুলিয়ান (সত্য) == নতুন বুলিয়ান (সত্য)) হল .... মিথ্যা। কারণ: বুলিয়ান কেবল একটি শ্রেণী এবং জাভাতে অন্য কোনও শ্রেণীর মতো একাধিক উদাহরণ থাকতে পারে।
এভ্রড্রাগন 14

35
হাঁ, লজ্জার যে, কন্সট্রাকটর ব্যক্তিগত তাই এটা নিশ্চিত হচ্ছে ... যে এটি একটি twingleton এর হওয়া উচিত
ফোরট্রান

15
"টুইংলটন" এর জন্য @Fortran +1।
বেনেট ম্যাকএলউই

1
এই আইডিয়ামটির উপরে অ্যাপাচি বুলিয়ান ইউটিস ব্যবহার করার কোনও অর্থ নেই।
স্টেক্সম্যান

82

অ্যাপাচি বুলিয়ান ইউটিলস ব্যবহার করুন ।

(যদি শীর্ষস্থানীয় পারফরম্যান্স আপনার প্রকল্পে সর্বাধিক গুরুত্বপূর্ণ অগ্রাধিকার হয় তবে একটি নেটিভ সমাধানের জন্য অন্য উত্তরগুলির মধ্যে একটির দিকে নজর দিন যার জন্য বাহ্যিক লাইব্রেরি সহ প্রয়োজন হয় না))

চাকা পুনরুদ্ধার করবেন না। ইতিমধ্যে নির্মিত হয়েছে এবং ব্যবহার করুন isTrue():

BooleanUtils.isTrue( bool );

কোনও Booleanমান সত্য হয় কিনা তা পরীক্ষা nullকরে ফেরত দিয়ে পরিচালনা করে false

যদি আপনি যে লাইব্রেরিগুলিকে অন্তর্ভুক্ত করার জন্য "অনুমতিপ্রাপ্ত" সীমাবদ্ধ না করেন তবে সমস্ত ধরণের ব্যবহারের ক্ষেত্রে Booleansএবং সহ, বেশ কয়েকটি দুর্দান্ত সহায়ক ফাংশন রয়েছে Strings। আমি আপনাকে বিভিন্ন অ্যাপাচি লাইব্রেরিটি অনুধাবন করার পরামর্শ দিচ্ছি এবং তারা ইতিমধ্যে কী প্রস্তাব দিচ্ছে তা দেখুন।


59
বিকল্পটি বাহ্যিক লাইব্রেরিটিকে মৌলিক কোনও কিছুর জন্য ব্যবহার করা হলে চাকাটিকে পুনরায় উদ্ভাবন করা খারাপ মনে হয় না।
পল মানতা

3
@ পলমন্ত আমি একমত যে আপনি যদি আপাচি ইউটিলেস লাইব্রেরিতে কখনও কখনও এটি ব্যবহার করেন তবে পরামর্শ দেওয়া ধারণাটি হ'ল গ্রন্থাগারগুলিকে অন্য সহায়ক কার্যক্রমে প্রকাশ করার জন্য "অনুভব" করা।
জোশুয়া পিন্টার

1
এই লাইব্রেরিগুলি ব্যবহার করার জন্য একটি পারফরম্যান্স পেনাল্টি রয়েছে। সুতরাং ভাষার প্রাথমিক অংশগুলির মতো প্রাথমিক বিষয়গুলির জন্য আপনার গ্রন্থাগার ব্যবহার করা উচিত নয়।
ACV

6
সেই লাইব্রেরিটি হুইলটিকে নতুন করে আনছে। আমি যতটা সম্ভব এই ধরনের লাইব্রেরি এড়ানোর চেষ্টা করি।
মিসচোনকার

3
@ এমএসচোনাকার যদি অ্যাপাচি বুলিয়ান ইউটিলস চক্রটিকে পুনরায় উদ্ভাবন করে তবে আসল চাকাটি কী? ধারণাটি হ'ল সহায়িকা ফাংশনগুলির একটি গোছা তৈরি করা এড়ানো উচিত যা এর আগে লাইব্রেরিতে কী ঘটেছে তা অনুকরণ করে। আমি toStringYesNoআমার সমস্ত অ্যাপ্লিকেশনগুলিতে এই লাইব্রেরি থেকেও ব্যবহার করি।
জোশুয়া পিন্টার

13

Booleanপ্রকার হতে পারে null। আপনি nullযেমনটি সেট করেছেন তেমন আপনাকে একটি চেক করা দরকার null

if (bool != null && bool)
{
  //DoSomething
}                   

3
এই উত্তর দিয়ে কি ভুল? এটি ব্যলের চেকিং নয় যে ব্যতিক্রম ছুঁড়ে ফেলবে। অপ্রয়োজনীয় ডাউনভোটস।
ডোডেক্সাহেড্রন

2
আমি সম্মত এটি একটি সম্পূর্ণ যুক্তিসঙ্গত উত্তর। আপনি যদিও ব্যতিক্রম পরিচালনা থেকে মুক্তি পেতে পারেন rid
মারভো

14
ব্যতিক্রম হস্তান্তর অপ্রয়োজনীয়, এবং এর পাশে এমনভাবে করা হচ্ছে যা শুরুর দিকে খারাপ উদাহরণ। এটি একটি ডাউনভোটের দাবিদার, আইএমও। (হ্যাঁ ... আমি জানি এটি উদাহরণ কোড থেকে এসেছে তবে উত্তরে এটির পুনরাবৃত্তি করা এটিকে সমর্থন করে বলে মনে হয়))
স্টিফেন সি

1
তাহলে সঠিক পথটি কী? আমি এখানে আপনার উত্তর দেখতে পাচ্ছি না।
মারভো

5
সঠিক উপায়টি হ'ল উপরের..অন্য ব্যতিক্রম হ্যান্ডেলিং। এছাড়াও, ব্যতিক্রম হ্যান্ডলিং খুব সাধারণ এবং নিরুৎসাহিত করা হয়।
ভেলভিশার

8

বা জাভা 8 ptionচ্ছিকের শক্তির সাহায্যে আপনি এই জাতীয় কৌশলও করতে পারেন:

Optional.ofNullable(boolValue).orElse(false)

:)


5

বুলিয়ান হ'ল আদিম বুলিয়ান for এই শ্রেণি, যে কোনও শ্রেণি হিসাবে, সত্যই নਾਲ হতে পারে। কর্মক্ষমতা এবং স্মৃতির কারণে আদিম ব্যবহার করা সর্বদা সেরা best

জাভা এপিআই-র মোড়ক ক্লাস দুটি প্রাথমিক উদ্দেশ্যে পরিবেশন করে:

  1. কোনও বস্তুর আদিম মানগুলিকে "মোড়ানোর" ব্যবস্থা দেওয়ার জন্য যাতে আদিমগুলিকে বস্তুর জন্য সংরক্ষিত ক্রিয়াকলাপগুলিতে অন্তর্ভুক্ত করা যায়, যেমন সংগ্রহে যোগ করা, বা কোনও বস্তুর রিটার্ন মান সহ একটি পদ্ধতি থেকে ফিরে আসা।
  2. আদিমদের জন্য ইউটিলিটি ফাংশনের একটি ভাণ্ডার সরবরাহ করা। এই ফাংশনগুলির বেশিরভাগই বিভিন্ন রূপান্তর সম্পর্কিত: স্ট্রিং অবজেক্টগুলিতে এবং থেকে আদিমকে রূপান্তরিত করে এবং আদিম এবং স্ট্রিং অবজেক্টগুলিকে বিভিন্ন ঘাঁটিতে (বা রডিক্স) রূপান্তর করে যেমন বাইনারি, অক্টাল এবং ষড়যন্ত্রক।

http://en.wikipedia.org/wiki/Primitive_wrapper_class


0

আপনার ভেরিয়েবল বুলটি নালার দিকে ইঙ্গিত করছে, আপনি সর্বদা একটি নালপয়েন্টার এক্সসেপশন পাবেন, আপনাকে প্রথমে কোথাও একটি নাল মান না দিয়ে ভেরিয়েবলটি শুরু করতে হবে এবং তারপরে এটি পরিবর্তন করতে হবে।


1
যদি এটি ঠিক তেমন হয় তবে catchব্লকটি নুলপয়েন্টারএক্সসেপশন পরিচালনা করবে। এখানে সমস্যা হ'ল ওপ একটি আদিম মধ্যে নাল-রেফারেন্স আনবক্স করার চেষ্টা করে।
মাইক অ্যাডলার

"আপনি সর্বদা থাকবেন" - সর্বদা নয়, নমুনা ব্যতীত, সরলিকৃত কোড যা ভেরিয়েবলটি আরম্ভ করার nullপরে এটি পরীক্ষা করার মধ্যে কিছু করে না । সম্ভবত আসল কোডটি এত সহজ না বা পুরো ifপরীক্ষাটি মুছে ফেলা হতে পারে।
nnnnnn
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.