0Pricing
Java Academy · درس

مخاطر Autoboxing

مخاطر فك التغليف لقيمة null ومعامل ==

مخاطر Autoboxing درس مجاني في Java Academy على CoddyKit. هذا هو الدرس 4 من أصل 4. يمكنك قراءة الدرس كاملاً أدناه مجاناً — ثم تمرن عليه مباشرة في المتصفح باستخدام محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7. هذا الدرس جزء من مسار التعلم في Java Academy، وتقدمك يتزامن عبر الويب وتطبيق CoddyKit. تتضمن دورة Java Academy 4 دروس في المجموع.

للراحة مخاطرها

يجعل التغليف التلقائي الشيفرة أكثر نظافة، لكنه يخفي تحويلات قد تسبب أخطاءً مفاجئة. وأكبر مطبّين هما فك تغليف null ومقارنة الهوية باستخدام ==.

يوضح هذا الدرس كيفية تجنّب كليهما.

مطب فك تغليف null

إذا كان الصنف المغلِّف يحتوي على null ثم فككت تغليفه إلى نوع بدائي، فإن Java تطرح NullPointerException.

من السهل ألا تلاحظ ذلك، لأن الشيفرة تبدو كأنها عملية إسناد بسيطة.

public class Main {
    public static void main(String[] args) {
        Integer maybe = null;
        try {
            int value = maybe;
            System.out.println(value);
        } catch (NullPointerException e) {
            System.out.println("Cannot unbox null!");
        }
    }
}

القيمة null في العمليات الحسابية

يظهر هذا المطب أيضًا داخل التعبيرات. فعند جمع صنف مغلِّف قيمته null، يُفك تغليفه أولًا، ما يؤدي إلى طرح استثناء قبل بدء العملية الحسابية.

public class Main {
    public static void main(String[] args) {
        Integer count = null;
        try {
            int total = count + 5;
            System.out.println(total);
        } catch (NullPointerException e) {
            System.out.println("Null in arithmetic!");
        }
    }
}

الحماية من null

تحقّق دائمًا من أن الصنف المغلِّف ليس null قبل فك تغليفه، أو وفّر قيمة افتراضية.

public class Main {
    public static void main(String[] args) {
        Integer maybe = null;
        int safe = (maybe != null) ? maybe : 0;
        System.out.println(safe);
    }
}

مفاجأة التخزين المؤقت مع ==

يخزّن Integer.valueOf مؤقتًا القيم من -128 إلى 127. لذلك قد تشترك قيمتان مغلّفتان ضمن هذا النطاق في الكائن نفسه، ويعيد == القيمة true.

public class Main {
    public static void main(String[] args) {
        Integer a = 100;
        Integer b = 100;
        System.out.println(a == b);
    }
}

خارج نطاق التخزين المؤقت

فوق نطاق التخزين المؤقت، ينشئ كل تغليف كائنًا منفصلًا. عندئذ يقارن == المراجع ويعيد القيمة false، رغم تساوي العددين.

public class Main {
    public static void main(String[] args) {
        Integer a = 200;
        Integer b = 200;
        System.out.println(a == b);
    }
}

استخدم equals دائمًا

لأن == مع الكائنات المغلّفة يقارن هوية الكائن، يجب استخدام .equals() لمقارنة القيم الرقمية الفعلية.

public class Main {
    public static void main(String[] args) {
        Integer a = 200;
        Integer b = 200;
        System.out.println(a.equals(b));
    }
}

مزج == مع نوع بدائي

إذا كان أحد طرفي == من نوع بدائي، تفك Java تغليف الكائن المغلّف تلقائيًا، ولذلك تجري المقارنة حسب القيمة. هذا موثوق، لكنه قد يسبب استثناءً إذا كان الكائن المغلّف يساوي null.

public class Main {
    public static void main(String[] args) {
        Integer a = 200;
        int b = 200;
        System.out.println(a == b);
    }
}

التغليف التلقائي الخفي في الحلقات

يؤدي تعريف متغير التجميع في الحلقة ككائن مغلّف إلى إنشاء كائن جديد في كل تكرار. في المثال أدناه، سيؤدي استخدام Long بدلًا من long إلى تكرار التغليف. يُفضّل استخدام النوع البدائي.

public class Main {
    public static void main(String[] args) {
        long sum = 0;
        for (int i = 0; i < 1000; i++) {
            sum += i;
        }
        System.out.println(sum);
    }
}

يعيد Map.get القيمة Null

هذا خطأ شائع في التطبيقات الواقعية: تعيد Map.get القيمة null عند غياب المفتاح. ويؤدي فك تغليف هذه النتيجة إلى int إلى رمي استثناء. استخدم getOrDefault بدلًا من ذلك.

import java.util.HashMap;
import java.util.Map;

public class Main {
    public static void main(String[] args) {
        Map<String, Integer> scores = new HashMap<>();
        int score = scores.getOrDefault("missing", 0);
        System.out.println(score);
    }
}

البرمجة بأمان

تمنع عادتان معظم أخطاء التغليف التلقائي: لا تفك تغليف قيمة قد تكون null أبدًا، وقارن قيم الكائنات المغلّفة دائمًا باستخدام .equals() بدلًا من ==.

اختبار سريع

اختبر مدى وعيك بمخاطر التغليف التلقائي.

مراجعة

تعلّمت مخاطر التغليف التلقائي الأساسية:

  • يؤدي فك تغليف كائن مغلّف يساوي null إلى رمي NullPointerException
  • استخدم فحصًا للقيمة الفارغة أو قيمة افتراضية للحماية
  • يقارن == بين الكائنات المغلّفة حسب المراجع، مع التخزين المؤقت للقيم من -128 إلى 127
  • استخدم .equals() دائمًا لمقارنة القيم
  • استخدم getOrDefault لتجنب القيمة الفارغة عند البحث في الخرائط

الأسئلة الشائعة

هل درس «مخاطر Autoboxing» مجاني؟

نعم — نص درس «مخاطر Autoboxing» كامل متاح مجاناً هنا على الويب. لتمرينه بشكل تفاعلي (محرر أكواد مدمج ومدرس ذكاء اصطناعي متاح 24/7) وفتح باقي دورة Java Academy، انتقل إلى CoddyKit PRO. تتضمن دورة Java Academy 4 دروس في المجموع.

ماذا ستتعلم في «مخاطر Autoboxing»؟

مخاطر فك التغليف لقيمة null ومعامل == تتمرن على Java Academy مع أكواد عملية تشغلها مباشرة في المتصفح، ومدرس ذكاء اصطناعي متاح 24/7 يجيب على أسئلتك أثناء عملك.

هل أحتاج إلى خبرة سابقة لأبدأ Java Academy؟

لا تُشترط خبرة سابقة. Java Academy على CoddyKit منظم للمبتدئين حتى المتقدمين، لذا يمكنك البدء من هنا أو من البداية والتقدم بسرعتك الخاصة. هذا هو الدرس 4 من أصل 4.

كم من الوقت يستغرق درس «مخاطر Autoboxing»؟

معظم دروس CoddyKit تستغرق حوالي 5–10 دقائق. كل منها موجز وتفاعلي، لذا تحرز تقدماً مستمراً وتستأنف من حيث توقفت عبر الويب والتطبيق.

هل يمكنني كتابة وتشغيل أكواد في درس Java Academy هذا؟

نعم. كل درس في Java Academy يتضمن محرر أكواد مدمج، لذا تكتب وتشغل أكواداً حقيقية مباشرة في متصفحك وتحصل على تعليقات فورية من الذكاء الاصطناعي — بدون إعداد محلي.

جميع الدروس في هذه الدورة

  1. الأنواع البدائية مقابل أنواع Wrapper
  2. Autoboxing وUnboxing
  3. Parsing وValueof
  4. مخاطر Autoboxing
← العودة إلى Java Academy