Java / الأساسي / الدرس 2
القيم والأنواع والتعبيرات العددية
اختر تمثيلات تحفظ معنى القيمة وافهم الأنواع الأولية والمراجع والحساب الصحيح والتحويل والمنطق وUnicode وnull.
في هذه الصفحة
أهداف الدرس
- توقع الحساب الصحيح والعائم.
- تمييز قيمة المرجع من الكائن.
- اختيار حدود تحويل وتحقق صريحة.
ميّز القيم الأولية والمراجع
للمتغير نوع يقيد قيمه وعملياته. يحمل int وlong أعداداً صحيحة موقعة، ويقرب double الحساب الحقيقي، ويحمل boolean صحيحاً أو خاطئاً، ويحمل char وحدة UTF-16 واحدة. أما متغير المرجع فيحمل مرجع كائن أو null. ينسخ إسناد المرجع قيمته لا محتويات الكائن.
اختر التمثيل وفق المجال. رمز العميل الذي يبدأ بأصفار نص غالباً لا عدد. يحتاج المال الدقيق تصميماً عشرياً مقصوداً مثل BigDecimal بمنازل وتقريب محددين، لا افتراض أن double يمثل كل كسر عشري تماماً. سلامة النوع لازمة لكنها لا تثبت صحة العمل.
تتبع أنواع المعاملات في القسمة
تزيل القسمة الصحيحة الجزء الكسري باتجاه الصفر. لا يستعيد إسناد الناتج إلى double ما فُقد سابقاً. رقّ أحد المعاملين قبل القسمة إن أردت كسراً. يقارن المثال 7 / 2 مع 7 / 2.0 ويستخدم الباقي لفحص الزوجية. فسّر نوع التعبير قبل متغير الوجهة.
قد يتجاوز الحساب الصحيح المدى دون استثناء مع العمليات المعتادة. لا ينقذ متغير long ضرباً جرى أولاً بنوع int؛ استخدم معاملاً long أو عملية تكشف التجاوز عند الحاجة. ولحساب عدد موجب تحقق من عدم السلبية وعدم المقام الصفري. مدى النوع ومجال العمل فحصان منفصلان.
public class Main {
public static void main(String[] args) throws Exception {
System.out.println(7 / 2);
System.out.println(7 / 2.0);
System.out.println(7 % 2);
}
}
3
3.5
1
يعطي معاملا int القيمة 3، ويعطي وجود double القيمة 3.5، والباقي واحد.
اجعل التحويل يعبر عن سياسة
يكون التوسيع العددي ضمنياً غالباً، بينما يحتاج التضييق عادة تحويلاً صريحاً وقد يفقد معلومة. يحول cast القيمة 3.9 إلى int فتصبح 3 لا أقرب عدد. تحول دالة التحليل النص وفق قواعدها وقد ترفضه؛ وليس cast محلل نصوص. لا تضيق النوع لإسكات المترجم دون فهم المدى المفقود.
يستخدم المثال Math.addExact لمجموع صغير صالح. تطلق الواجهة ArithmeticException إن تجاوز ناتج int المدى، فتتيح رفض الحساب بقصد. لا يثير المثال التجاوز، لذلك ناتجه ثابت. ميّز مع مدخل المستخدم فشل التحليل وتجاوز الحساب والعدد الصحيح نوعياً الخارج عن مجال العمل.
public class Main {
public static void main(String[] args) throws Exception {
int total = Math.addExact(40, 2);
int truncated = (int) 3.9;
System.out.println(total);
System.out.println(truncated);
}
}
42
3
المجموع ضمن مدى int، ويزيل التحويل الجزء الكسري ولا يستدعي دالة تقريب.
استخدم المنطق وnull بقصد
تتطلب الشروط تعبيرات boolean؛ ولا يعتبر Java عدداً اعتباطياً صحيحاً. تختصر && و
التقييم، فيحمي فحص null اليساري الوصول اللاحق ضمن التعبير نفسه. لا يغني ذلك عن عقد إدخال: قرر هل يسمح بغياب الاسم وكيف يختلف من النص الفارغ أو ذي المسافات.
يجب إسناد قيمة محلية قطعاً قبل استخدامها. تحصل الحقول على قيم افتراضية كالصفر وnull وقد تخفي نقص التصميم. يمكن أن يكون Integer المغلف null ويطلق فك تغليفه تلقائياً NullPointerException. فضّل النوع الأولي إن لم يكن للغياب معنى ومثّل الاختيار صراحة عند حدوده.
ميّز المحارف والوحدات والبايتات
لا يمثل char أي محرف Unicode كامل بالضرورة. تقيس فهارس String وحدات UTF-16، وتشغل نقطة إضافية وحدتين. البايتات المشفرة تمثيل آخر يحتاج مجموعة محارف. لا تتساوى أعداد حرف عربي ورمز تعبيري ووحدة مرئية للمستخدم تحت كل المقاييس. حدد وحدة حد الطول.
وحّد الثوابت وترميز المصدر وفك الإدخال. ترجم الدورة بـ -encoding UTF-8 واستخدم UTF-8 صراحة للبايتات الخارجية. لا يصلح نوع عددي صحيح نصاً تالفاً، ولا يثبت فك الترميز صحة قيمة العمل. اعتبر التمثيل والتحقق مسؤوليتين مرتبطتين منفصلتين.
الأخطاء الشائعة وإصلاحها
Unexpected integer result
- لماذا يحدث؟
- حدثت قسمة صحيحة قبل التحويل.
- كيف تصلحه؟
- رقّ أحد المعاملين قبل القسمة.
- كيف تتجنب تكراره؟
- توقع نوع كل تعبير فرعي.
ArithmeticException
- لماذا يحدث؟
- خالف المقام الصفري أو تجاوز العملية الدقيقة عقدها.
- كيف تصلحه؟
- تحقق من المقام والمدى وعالج الفشل المقصود.
- كيف تتجنب تكراره؟
- اختبر الصفر والسالب وحدود المدى.
NullPointerException during unboxing
- لماذا يحدث؟
- كان المرجع المغلف null عند فكه.
- كيف تصلحه؟
- ارفض المفقود أو طبق بديلاً موثقاً قبل الفك.
- كيف تتجنب تكراره؟
- استخدم الأوليات عندما لا معنى للغياب.
اختبر فهمك
1. ماذا يحتوي double x = 5 / 2 وdouble y = 5 / 2.0؟
اعرض الحل المشروح
يحتوي x على2.0 لأن القسمة الصحيحة جرت أولاً، ويحتوي y على2.5 لأن معاملاً double شارك. لا يغير نوع الوجهة عملية قُيّمت سابقاً.
2. رمز منتج 00127. هل تخزنه int؟
اعرض الحل المشروح
غالباً لا؛ الأصفار جزء من الهوية ولا معنى للحساب. استخدم نصاً بصيغة متحقق منها. إن لزمت كمية عددية فحلل حقلاً منفصلاً وافحص مجاله.
أهم ما تعلمته
- تحدد أنواع التعبيرات سلوك الحساب.
- قد يكون المرجع null والكائن كيان مختلف.
- اختر المدى والدقة ووحدة النص وفق المتطلبات.