স্বতঃ-আনবক্সিংয়ের ত্রিনিরির প্রয়োজন যদি অন্যথায় হয়


23

এই কোডের টুকরোটি দুর্দান্ত কাজ করে: -

    Integer nullInt = null;
    if (1 <= 3) {
        Integer secondNull = nullInt;
    } else {
        Integer secondNull = -1;
    }
    System.out.println("done");

তবে এটি নাল-পয়েন্টার ব্যতিক্রম ছুঁড়ে ফেলেছে, যখন অ্যালিপস সতর্ক করে দিয়েছে যে অটো-আনবক্সিংয়ের দরকার আছে: -

    Integer nullInt = null;
    Integer secondNull = 1 <= 3 ? nullInt : -1;
    System.out.println("done");

কেন তাই হয়, কেউ দয়া করে গাইড করতে পারেন?

উত্তর:


22

ত্রৈমাসিকের শর্তসাপেক্ষ প্রকাশের ধরণ

1 <= 3 ? nullInt : -1

হ'ল int(জেএলএসে বেশ কয়েকটি সারণী রয়েছে যা ২ য় এবং ৩ য় অপারেশনগুলির উপর নির্ভর করে টের্নারি শর্তসাপেক্ষ অপারেটরের ধরণের বর্ণনা দেয়)।

সুতরাং, যখন এটি একটিতে আনবক্স nullIntকরার চেষ্টা করে int, একটি NullPointerExceptionনিক্ষেপ করা হয়।

আপনার যদি-অন্য স্নিপেটের আচরণ পেতে, আপনাকে লিখতে হবে:

1 <= 3 ? nullInt : Integer.valueOf(-1)

এখন এক্সপ্রেশনটির Integerধরণটি হবে, সুতরাং কোনও আনবক্সিং হবে না।


4
কেবলমাত্র আপনার উত্তরে যুক্ত করতে এখানে উল্লিখিত টেবিলগুলি এখানে রয়েছে: ডকস.ওরকল
জ্যাভেস

3

আমি যথেষ্ট নিশ্চিত যে টের্নারি অপারেটরের পক্ষে যুক্তিগুলি একই ধরণের হওয়া দরকার। যেহেতু আপনি -1 ব্যবহার করছেন এবং কিছু ধ্রুবক nullintসংকলক nullintমান পেতে আনবক্সে যাওয়ার চেষ্টা করে । এবং তারপরে এটি secondNullভেরিয়েবলে সঞ্চয় করতে অটোবক্স ।


3

এটি কারণ যখন শর্তসাপেক্ষ অপারেটরের জন্য দুটি অপারেশনগুলি ? :একটি প্রিমিটিভ টাইপ এবং এটির বাক্সযুক্ত রেফারেন্স টাইপ হয় তখন একটি আনবক্সিং রূপান্তর হয় ( জেএলএস §15.25.2 ):

একটি সংখ্যার শর্তসাপেক্ষ প্রকাশের ধরণটি নিম্নলিখিত হিসাবে নির্ধারিত হয়:

  • ...
  • যদি দ্বিতীয় এবং তৃতীয় অপারেন্ডগুলির মধ্যে একটি টি আদিম টাইপের টি হয়, এবং অন্যটির ধরণের টি বক্সে বক্সিং রূপান্তর (.15.1.7) প্রয়োগের ফলাফল হয়, তবে শর্তসাপেক্ষ প্রকাশের ধরণটি টি হয়।

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


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