"إذا أراد العامل أن يؤدي عمله بشكل جيد، فعليه أولاً أن يشحذ أدواته." - كونفوشيوس، "مختارات كونفوشيوس. لو لينجونج"
الصفحة الأمامية > برمجة > لماذا يسمح المشغل الثلاثي بإرجاع Null لـ int بينما لا يسمح بيان if بذلك؟

لماذا يسمح المشغل الثلاثي بإرجاع Null لـ int بينما لا يسمح بيان if بذلك؟

تم النشر بتاريخ 2024-11-13
تصفح:306

Why Does the Ternary Operator Allow Null Return for int While an if Statement Doesn't?

بيان المشغل الثلاثي مقابل بيان if للإرجاع الفارغ لـ int

في Java، يسمح المشغل الثلاثي (؟:) بتعيين null إلى متغير من النوع int، على الرغم من أن int هو نوع بيانات بدائي لا يدعم القيم الخالية. خذ بعين الاعتبار مقتطف التعليمات البرمجية التالي:

int temp() {
    return true ? null : 0;
}

في هذا الكود، يقوم العامل الثلاثي بتعيين قيمة null إلى درجة الحرارة المتغيرة إذا كان الشرط الذي تم تقييمه صحيحًا، وإلا فإنه يعين 0. يسمح المترجم بهذا التعيين دون إصدار أي أخطاء. ومع ذلك، عند تنفيذ الطريقة، فإنها ستطرح NullPointerException في وقت التشغيل لأن null ليست قيمة صالحة لـ int.

على النقيض من العامل الثلاثي، فإن عبارة if لا تسمح بمثل هذه التعيينات الخالية لمتغيرات أنواع بدائية. على سبيل المثال:

int same() {
    if (true) {
        return null;
    } else {
        return 0;
    }
}

سيؤدي هذا الرمز إلى إنشاء خطأ في وقت الترجمة مع الرسالة "أنواع غير متوافقة: لا يمكن تحويل null إلى int." يكمن سبب هذا التناقض في الطريقة التي يتعامل بها المترجم مع القيمة الخالية.

في حالة المشغل الثلاثي، يفسر المترجم القيمة الحرفية الخالية كمرجع فارغ إلى عدد صحيح، فئة المجمع لـ int. ويرجع ذلك إلى قواعد المترجم الخاصة بـ autoboxing وunboxing: عند التحويل من نوع بدائي إلى نوع كائن، يقوم Java Virtual Machine (JVM) تلقائيًا بتغليف القيمة الأولية في غلاف الكائن المقابل.

نظرًا لأن int عبارة عن النوع البدائي، سيحاول المترجم إلغاء القيمة الفارغة التي يتم إرجاعها بواسطة عامل التشغيل الثلاثي، مما يؤدي إلى NullPointerException.

في من ناحية أخرى، لا تقوم عبارة if بعملية إلغاء العلبة هذه، ويظل الحرف الخالي كمرجع فارغ للكائن. نظرًا لأن نوع الإرجاع لنفس الطريقة () هو int، فلا يمكن للمترجم تحويل المرجع الفارغ إلى int، ومن هنا حدث خطأ وقت الترجمة.

أحدث البرنامج التعليمي أكثر>

تنصل: جميع الموارد المقدمة هي جزئيًا من الإنترنت. إذا كان هناك أي انتهاك لحقوق الطبع والنشر الخاصة بك أو الحقوق والمصالح الأخرى، فيرجى توضيح الأسباب التفصيلية وتقديم دليل على حقوق الطبع والنشر أو الحقوق والمصالح ثم إرسالها إلى البريد الإلكتروني: [email protected]. سوف نتعامل مع الأمر لك في أقرب وقت ممكن.

Copyright© 2022 湘ICP备2022001581号-3