জাভা: অবজেক্ট নাল কিনা তা কীভাবে চেক করবেন?


89

আমি একটি অ্যাপ্লিকেশন তৈরি করছি যা ওয়েব থেকে চিত্রগুলি পুনরুদ্ধার করে। যদি চিত্রটি পুনরুদ্ধার করা যায় না তবে অন্য একটি স্থানীয় চিত্র ব্যবহার করা উচিত।

নিম্নলিখিত লাইনগুলি কার্যকর করার চেষ্টা করার সময়:

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable.equals(null)) {
  drawable = getRandomDrawable();
}

(অঙ্কনযোগ্য.এক্কালস (নাল)) রেখা যদি অঙ্কনযোগ্য শূন্য হয় তবে একটি ব্যতিক্রম ছুঁড়ে।

কেউ কি জানেন যে অঙ্কনযোগ্যটির মানটি কীভাবে পরীক্ষা করা উচিত যাতে এটি ব্যর্থ হয় এবং স্থানীয় চিত্রটি পুনরুদ্ধার করতে না পারে (অঙ্কনযোগ্য = getRandomDrawable () কার্যকর করুন)?


23
ব্যবহার করুন থাকেন (অঙ্কনযোগ্য == নাল) একটি শূন্য বস্তুর উপর কোন পদ্ধতি কলিং একটি নালপয়েন্টারএক্সেপশন হয়।
diciu

4
আপনি কেন একটি মন্তব্যের পরিবর্তে একটি সাধারণ উত্তর লিখবেন না, ডিকিউ?
ডীমন

@ জারেডবুরোস কোনও প্রশ্নের কোডটি এমনভাবে সম্পাদনা করবেন না যাতে প্রশ্নের উদ্দেশ্য হারাতে পারে!
গিলস 'অশুভ হওয়া বন্ধ করুন'

@ গিলস আমার সম্পাদকীয় মন্তব্য পড়ুন, আমি কোডটি আরও পাঠযোগ্য।
জ্যারেড বুরোজ

@ জারেডবুরুজ না, আপনার সম্পাদনাটি কোনও "ফর্ম্যাটিং" পরিবর্তন ছিল না। আপনি নন-ওয়ার্কিং কোডটি প্রশ্নের উত্তর দিয়েছেন যা কার্যকরী কোডে প্রশ্নটি মোটা করে তুলেছে।
গিলস 'অশুভ হওয়া বন্ধ করুন'

উত্তর:


35

সম্পাদিত জাভা 8 সমাধান:

final Drawable drawable = 
    Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
        .orElseGet(() -> getRandomDrawable());

আপনি drawable finalএই ক্ষেত্রে ঘোষণা করতে পারেন ।

চাসমো যেমন উল্লেখ করেছে, অ্যান্ড্রয়েড এই মুহূর্তে জাভা 8 সমর্থন করে না। সুতরাং এই সমাধানটি কেবলমাত্র অন্যান্য প্রসঙ্গেই সম্ভব।


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

4
উদাহরণটি এখন পুরোপুরি জাভা 8-এ পুনরায় লিখিত, সুতরাং আমার সমাধানটি আর অকেজো মূল্যায়নগুলি ভুগছে না (যেমন @ পেটকিরখাম আমার মূল সমাধানটিতে নির্দেশ করেছেন)।
ডিমন

4
অ্যান্ড্রয়েড জাভা ৮ সমর্থন করে না। এটি কেবল জাভা 7 পর্যন্ত সমর্থন করে (যদি আপনার কিটক্যাট থাকে) এবং এখনও এটিতে নতুন নতুন সিনট্যাক্স চিনির চালান নেই oked এর পাশাপাশি, Optional.ofবোঝা যাচ্ছে যে মানটি নাল নয়, এবং তাই এটি orElseGetঅপ্রয়োজনীয়। Optional.ofNullableএই ক্ষেত্রে আপনার ব্যবহার করা উচিত ।
মার্টিন সেলার

181
Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable == null) {
    drawable = getRandomDrawable();
}

equals()জন্য পদ্ধতি চেক মান সমতা, যার মানে এটা তুলনা বিষয়বস্তু দুটি বস্তুর করুন। যেহেতু nullকোনও বস্তু নয়, তাই আপনার সামগ্রীর সামগ্রীর সামগ্রীগুলির সাথে তুলনা করার চেষ্টা করার সময় এটি ক্র্যাশ হয় null

==জন্য অপারেটর চেক রেফারেন্স সমতা, যার মানে দেখে মনে হচ্ছে কিনা দুটি বস্তুর আসলে খুব একই বস্তুর । এটির জন্য বস্তুগুলি আসলে বিদ্যমান থাকে না; দুটি অস্তিত্বযুক্ত বস্তু ( nullরেফারেন্স) এছাড়াও সমান।


56
আমি একটি খুব মূল্যবান টিপ যোগ করতে চাই: আপনার যদি তুলনা করার জন্য স্ট্রিং বা ধ্রুবক থাকে তবে সর্বদা এটিকে সমতুল্য ধারাতে প্রথমে রাখুন। (যদি ("coyote" .Equals (myDogString))) (যদি (myDogString.equals ("coyote"))) এর চেয়ে অনেক ভাল হয় কারণ দ্বিতীয় ক্ষেত্রে মায়ডোগস্ট্রিং নাল হতে পারে এবং একটি এনপিই নিক্ষেপ করে যখন প্রথম ক্ষেত্রে এটি না ঘটে 'মাইডোগস্ট্রিং নাল থাকলে কিছু যায় আসে না।
থারস্টেন এস

21
যোদা শর্ত হিসাবে পরিচিত: "যদি কোয়েট হয় তবে কুকুরটি ..."
টমাস

4
আমি আরও যোগ করতে চাই, জাভা 7-এর পর থেকে একটি অবজেক্টস.এক্কালস () পদ্ধতি রয়েছে, যে আপনি
যোডা

22

আমি এই পদ্ধতির ব্যবহার:

if (null == drawable) {
  //do stuff
} else {
  //other things
}

এইভাবে আমি সন্ধানের লাইনের পাঠযোগ্যতা উন্নত করেছি - উত্স ফাইলের মাধ্যমে আমি দ্রুত পড়ার সাথে সাথে দেখতে পাচ্ছি এটি একটি নাল চেক।

আপনি যে .equals()কোনও বস্তুর কাছে কেন কল করতে পারবেন না সে সম্পর্কে null; যদি অবজেক্ট রেফারেন্স আপনি (যথা 'অঙ্কনযোগ্য') আছে হয় আসলে null, এটা গাদা উপর একটি বস্তু নির্দেশ করে না। এর অর্থ হ'ল যে স্তূপে কলটি equals()সফল হতে পারে তাতে কোনও আপত্তি নেই ।

শুভকামনা করছি!


4
আমিও যদি (<কনস্ট্যান্ট> == <পরিবর্তনশীল>) দুর্ঘটনাজনিত কার্যভার থেকে নিজেকে রক্ষা করার উপায় হিসাবে নির্মাণকে পছন্দ করি prefer
স্কট

7

ডিআইওয়াই

private boolean isNull(Object obj) {
    return obj == null;
}

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (isNull(drawable)) {
    drawable = getRandomDrawable();
}

6
drawable.equals(null)

উপরের লাইনটি অঙ্কনযোগ্য বস্তুর উপর "সমান (...)" পদ্ধতি কল করে।

সুতরাং, যখন অঙ্কনযোগ্য শূন্য হয় না এবং এটি একটি সত্য বস্তু হয়, তখন "সমান (নাল)" পদ্ধতিটি কল করার পরে সমস্ত কিছু ভাল হয় "মিথ্যা" ফিরে আসবে

কিন্তু যখন "অঙ্কনযোগ্য" নাল হয়, তার অর্থ নাল বস্তুর উপর "সমান (...)" পদ্ধতি কল করার অর্থ, যে অস্তিত্ব নেই এমন কোনও পদ্ধতির কল করা মানে এটি "নালপয়েন্টারএক্সেপশন" নিক্ষেপ করে

কোনও বস্তু বিদ্যমান এবং এটি নাল নয় কিনা তা পরীক্ষা করতে নিম্নলিখিত ব্যবহার করুন

if(drawable == null) {
    ...
    ...
}

উপরের শর্তে, আমরা যাচাই করে দেখছি যে রেফারেন্স ভেরিয়েবল "অঙ্কনযোগ্য" নাল বা এতে কিছু মান রয়েছে (এর বস্তুর রেফারেন্স) যাতে এটি ব্যতিক্রম ছুঁড়ে না ফেলে ক্ষেত্রে অঙ্কনযোগ্য চেক করার মতো নাল হয়

null == null

বৈধ.



0

নুলপয়েন্টার এক্সসেপশন ধরার জন্য এটি সম্ভবত কিছুটা দক্ষ। উপরের পদ্ধতিগুলির অর্থ রানটাইম দু'বার নাল পয়েন্টার অনুসন্ধান করছে।


4
if x == nullসমাধানে ডাবল চেক কোথায় ?
deamon

ইফ স্টেটমেন্টের পরে, রানটাইমটি যখন বস্তুটি ব্যবহৃত হবে তখন নাল পয়েন্টারটির জন্য আবার পরীক্ষা করবে। যদিও এটি কম্পাইলার দ্বারা অনুকূলিত হয়েছে কিনা তা আমি জানি না।
টম আর

4
এটি নিয়ন্ত্রণ প্রবাহ হিসাবে ব্যতিক্রমগুলি ব্যবহার করে প্রচলিত জ্ঞানের বিরুদ্ধে যায়।
জেমস

4
ব্যতিক্রমগুলি খুব ব্যয়বহুল, যেহেতু তাদের পুরো স্ট্যাকট্র্যাস তৈরি করা দরকার।
ডায়মন

0

হ'ল নাল-চেক (ডিমন এর আপডেট) হ্যান্ডেল করতে গুগল পেয়ারা ব্যবহার করুন

Drawable drawable = Optional.of(Common.getDrawableFromUrl(this, product.getMapPath())).or(getRandomDrawable());

জাভা 8 আরও ভাল ব্যবহার Optionalআজ।
ডিমন

-1

জাভা উত্স বিকাশকারীকে কেবল ওরাকলকে কিছু ধারণা দেওয়ার জন্য :-)

সমাধান ইতিমধ্যে। নেট মধ্যে বিদ্যমান এবং আরও অনেক বেশি পঠনযোগ্য!

ভিজ্যুয়াল বেসিক। নেট

Drawable drawable 
    = If(Common.getDrawableFromUrl(this, product.getMapPath())
        ,getRandomDrawable()
        )

সি # তে

Drawable drawable 
    = Common.getDrawableFromUrl(this, product.getMapPath() 
        ?? getRandomDrawable();

এই সমাধানগুলি কেবল নতুন অপারেটর যুক্ত না করে ল্যাম্বডা এক্সপ্রেশনটি ব্যবহার না করে ptionচ্ছিক জাভা সমাধান (ডিফল্ট স্ট্রিংটি মূল মূল্য নাল থাকলে কেবল মূল্যায়ন করা হয়) হিসাবে শক্তিশালী।

জাভা সমাধানের সাথে দ্রুত পার্থক্যটি দেখতে, আমি 2 টি জাভা সমাধান যুক্ত করেছি

জাভাতে ptionচ্ছিক ব্যবহার

Drawable drawable = 
    Optional.ofNullable(Common.getDrawableFromUrl(this, product.getMapPath()))
        .orElseGet(() -> getRandomDrawable());

জাভাতে Using Using ব্যবহার করা হচ্ছে

Drawable drawable = Common.getDrawableFromUrl(this, product.getMapPath());
if (drawable != null)
    {
    drawable = getRandomDrawable();
    }

ব্যক্তিগতভাবে, আমি ভিবি.নেট পছন্দ করি তবে আমি জাভাতে পছন্দ করি ?? C#বা if {}সমাধান করি ... এবং আপনি?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.