মান নির্ধারণের সময় বিজোড় জাভা ত্রিবারি আচরণ। জাভা এই ঘটনার জন্য পর্দার পিছনে কী করছে?


10

কিছু দিন আগে, আমি এক মনোমুগ্ধকর দৃশ্যে ছুটে এসেছি যে জাভা কীভাবে বা কেন নিম্নলিখিতটি ঘটতে দেয় সে সম্পর্কে কোনও নথিপত্র পাইনি find (এই স্নিপেটটি বাগের কেবল একটি সরলীকৃত ফর্ম))

    @Test
    public void test() {
      boolean bool = false;
      Integer intVal = Integer.valueOf(5);
      Long longVal = null;
      Long result = bool ? intVal : longVal;

      System.out.println(" > " + result);
   }

উপরের স্নিপেটে:

যদি বুল = সত্য হয়, তবে আপনি মান '5' পাবেন;

তবে যদি বুল = মিথ্যা হয় তবে ত্রৈমাসিক ক্রিয়াকলাপটি মূল্যায়নের চেষ্টা করার সময় আপনি একটি নাল পয়েন্টার ব্যতিক্রম পাবেন। মুদ্রণ বিবৃতি নয়।


এটি ঠিক করতে আমি কেবল 'ফলাফল' এ পরিবর্তন করি

Long result = bool ? Long.valueOf(intVal) : longVal;

এটি করা, আমার প্রয়োজনীয় প্রত্যাশিত আচরণ দেবে:

যদি বুল = সত্য হয়, তবে আপনি মান '5' পাবেন;

তবে যদি বুল = মিথ্যা হয় তবে আপনি 'নাল' পেয়ে যাবেন


মজার অংশটি হ'ল আপনি যদি এটিকে স্বাভাবিক / / অন্য বিবৃতিতে ভাগ করেন তবে জাভা আপনাকে সংকলন করতে দেয় না

longVal = intVal; 

তবে এটি টেরিনারি অপারেটরের মাধ্যমে তা ধরা দেয় না। তাই জাভা আসল স্নিপেটে এটিকে নাল পয়েন্ট করতে কী করছে?

(জাভা ১১)

উত্তর:


10

আপনি যখন এটি করবেন:

Long result = bool ? intVal : longVal

এই এক্সপ্রেশনটি একটি ফেরত দিচ্ছে longএবং, যখন boolএটি মিথ্যা nullহয় তখন resultভেরিয়েবলের সাথে মানিয়ে নিতে একটি দীর্ঘ মানকে আনবক্স করার চেষ্টা করে এবং একটি এনপিই নিক্ষেপ করে।

আপনি যখন এটি করবেন:

Long result = bool ? Long.valueOf(intVal) : longVal

এই এক্সপ্রেশনটি ইতিমধ্যে ফিরে আসছে Longতখন আনবক্সিংয়ের কোনও প্রয়োজন নেই এবং nullমানটি সফলভাবে resultভেরিয়েবলের জন্য বরাদ্দ করা হয়েছে ।

রেফারেন্স:

মন্তব্য বিভাগে যেমন আলোচনা হয়েছে, কেন এটি ঘটে তা আরও ভালভাবে বুঝতে, জেএলএসের নিম্নলিখিত বিভাগগুলি দেখুন:


আমি বিস্মিত হয়েছি আপনি পৃথক রেফারেন্স সারণী 15.25 এ থেকে ই যেখানে এটি "স্পষ্ট" যে পূর্ণসংখ্যা / লং ফলাফল একটি বিএনপি (পূর্ণসংখ্যা, লং) এর ফলাফল দেয়।
ম্যাট

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

জেএলএস হিসাবে বিভাগের ৫..6.২ বলছে: "যদি কোনও অপারেন্ড রেফারেন্স ধরণের হয় তবে এটি আনবক্সিং রূপান্তরের শিকার হয়"; তারপরে "প্রশস্ত আদিম রূপান্তর (§5.1.2) প্রয়োগ করা হয়েছে [..]"
ডিয়েগো ম্যাগডালেনো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.