Menu
flag Ar iconالعربيةdown icon

if-else في Java: عبارات شرطية مع أمثلة

كيفية اتخاذ القرارات في Java باستخدام if وelse if وelse: الشروط المنطقية، وربط الفروع، والتداخل، والمعامل الثلاثي، والأخطاء الشائعة التي تربك الكثيرين.

تحتوي هذه الصفحة على محررات قابلة للتشغيل - حرّر، شغّل، وشاهد النتيجة فوراً.

اتخاذ القرارات باستخدام if

تحتاج البرامج إلى التفاعل مع البيانات: نجاح أم رسوب، متوفر أم نفد، صالح أم لا. عبارة if هي الطريقة التي تختار بها Java أيّ كود يُنفَّذ بناءً على شرط.

تأخذ if شرطًا منطقيًا بين قوسين، وتنفّذ الكتلة المحصورة بين القوسين المعقوفين فقط عندما يكون ذلك الشرط true:

الشرط score >= 60 قيمته true، لذا تُطبع الرسالة. السطر الذي يلي القوس المعقوف الختامي يُنفَّذ دائمًا؛ فهو خارج if. غيّر score إلى 40 فيُتجاوز سطر "passed" بالكامل.

على خلاف لغة C، لا تسمح لك Java بوضع رقم في موضع يُتوقع فيه قيمة منطقية. if (score) خطأ في الترجمة؛ إذ يجب أن يكون الشرط تعبيرًا boolean حقيقيًا مبنيًا من مقارنات (>, >=, ==, !=) أو من منطق منطقي (&&, ||, !).

إضافة else

يمنحك else المسار البديل، أي الكود الذي يُنفَّذ فقط عندما يكون الشرط false:

تُنفَّذ واحدة فقط من الكتلتين بالضبط؛ لا كلتاهما ولا واحدة منهما يُهمَل. ليس لـ else شرط خاص به؛ فهو ببساطة يلتقط كل ما لم تلتقطه if.

الربط باستخدام else if

عندما تكون هناك أكثر من نتيجتين، اربط الشروط بـ else if. تفحصها Java من الأعلى إلى الأسفل وتنفّذ أول كتلة يكون شرطها صحيحًا، ثم تتجاوز الباقي:

الترتيب مهم. لأن 84 يُفحص أولًا مقابل >= 90 (خطأ)، ثم مقابل >= 80 (صحيح)، فإنه يتوقف عند B ولا يختبر الحدود الدنيا إطلاقًا. ولهذا أيضًا لا تحتاج إلى كتابة score >= 80 && score < 90؛ فالوصول إلى الفرع الثاني يضمن بالفعل أن score كان أقل من 90. ضع شرطك الأضيق أو الأعلى أولويةً أولًا.

else الختامي هو الحالة الجامعة لديك. حذفه هنا سيكون خطأ في الترجمة، لأن grade قد يبقى غير مُسنَد عند طباعته.

مقارنة القيم: == مقابل equals()

أكثر أخطاء if شيوعًا في Java هو مقارنة السلاسل النصية بـ ==. للأنواع البدائية (int, double, char, boolean) يكون == صحيحًا. أما للكائنات، فإن == يسأل «هل هذا الكائن نفسه في الذاكرة؟» بينما .equals() يسأل «هل لهذين المحتوى نفسه؟»، وأنت تريد الأخير في الغالب الأعم:

تُطبع الرسالة الثانية فقط. فـ new String("yes") كائن مختلف عن الحرفية "yes"، لذا فإن == قيمته false، لكن النص متطابق، لذا فإن .equals() قيمته true. القاعدة العملية: الأنواع البدائية تستخدم ==، والكائنات تستخدم .equals().

حيلة آمنة لتجنّب NullPointerException عندما قد يكون المتغير null: ضع الحرفية أولًا، if ("yes".equals(input))، لأن الحرفية لا تكون null أبدًا.

دمج الشروط وتداخلها

يمكنك دمج الشروط بـ && (و) و|| (أو) و! (نفي)، أو تداخل if داخل أخرى عندما يكون الفحص ذا معنى فقط بعد اجتياز فحص سابق:

يُجري && و|| تقييمًا بالدائرة القصيرة: في a && b، إذا كان a خاطئًا فلن تُقيّم Java قيمة b إطلاقًا. هذا مفيد للحماية من الأخطاء: if (s != null && s.length() > 0) آمن لأن فحص الطول يُتجاوز عندما يكون s يساوي null. فضّل الدمج بـ && على التداخل العميق متى استطعت؛ فالكود المسطّح يُقرأ بوضوح أكبر من هرم من الأقواس المعقوفة.

مزلق كلاسيكي: علامة = المفردة إسناد، و== مقارنة. كتابة if (x = 5) خطأ في الترجمة بالنسبة لـ int (وهذا جيد)، لكن if (flag = true) على قيمة boolean يُترجَم ويُسنِد بصمت؛ فانتبه لذلك.

المعامل الثلاثي

عندما يكون كل ما تريده هو الاختيار بين قيمتين، يكون المعامل الثلاثي ?: سطرًا واحدًا مختصرًا. اقرأ condition ? a : b بمعنى «إذا تحقق الشرط فـ a وإلا فـ b»:

ينتج المعامل الثلاثي قيمة يمكنك إسنادها أو تمريرها مباشرة. احتفظ به للاختيار البسيط؛ فإذا احتاج أحد الفرعين إلى عدة عبارات أو منطق حقيقي، تظل عبارة if-else الكاملة واضحة القراءة، بينما يتحول المعامل الثلاثي المتداخل سريعًا إلى أحجية.

مزلق: فخّ الأقواس المعقوفة الاختيارية

تتيح لك Java حذف الأقواس المعقوفة عندما يحتوي الفرع على عبارة واحدة، لكن هذا يستدعي خطأً خفيًا. فالمحاذاة تخدع:

if (loggedIn)
    System.out.println("Welcome");
    System.out.println("Loading dashboard");   // NOT part of the if!

السطر الأول وحده هو ما تتحكم فيه if؛ أما الثاني فيُنفَّذ دائمًا مهما كان، رغم أن المحاذاة توحي بغير ذلك. استخدم الأقواس المعقوفة دائمًا، حتى لسطر واحد، وعندها يختفي هذا النوع من الأخطاء برمّته.

التالي: switch

سلاسل if-else if مثالية عندما يختبر كل فرع شرطًا مختلفًا. لكن عندما تقارن قيمة واحدة بعدد كبير من الاحتمالات الثابتة، كاسم يوم أو خيار من قائمة أو enum، يصبح سُلَّم else if الطويل متكررًا. عبارة switch مصممة لهذا الغرض تحديدًا، وهي الصفحة التالية.

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

كيف تكتب عبارة if-else في Java؟

ضع شرطًا منطقيًا بين قوسين بعد if، ثم الكود المطلوب تنفيذه بين قوسين معقوفين، وكتلة else اختيارية لحالة أن يكون الشرط خاطئًا: if (score >= 60) { System.out.println("Pass"); } else { System.out.println("Fail"); }. يجب أن يُقيَّم الشرط إلى boolean؛ فـ Java لا تقبل قيمة int كما تفعل لغة C.

ما الفرق بين == و equals() في عبارة if في Java؟

== يفحص ما إذا كان مرجعان يشيران إلى الكائن نفسه، بينما .equals() يقارن المحتوى. للأنواع البدائية مثل int استخدم ==. أما للكائنات، وخاصة String، فاستخدم .equals(): if (name.equals("Sam")) وليس if (name == "Sam"). استخدام == مع السلاسل النصية هو أكثر أخطاء if شيوعًا في Java.

ما هو المعامل الثلاثي في Java؟

المعامل الثلاثي condition ? valueIfTrue : valueIfFalse هو صيغة if-else مختصرة تنتج قيمة. على سبيل المثال، String label = age >= 18 ? "adult" : "minor"; يُسنِد إحدى القيمتين بناءً على الشرط. استخدمه لاختيار قيمة بسيط؛ والجأ إلى if-else كاملة عندما يكون هناك منطق ينبغي تنفيذه في كل فرع.

Coddy programming languages illustration

تعلّم البرمجة مع Coddy

ابدأ الآن