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

حلقة while في جافا: الصياغة، do-while، والأخطاء الشائعة

شرح حلقة while في جافا - حلقة while التي تفحص الشرط أولًا، وحلقة do-while التي تعمل مرة واحدة على الأقل، والقراءة حتى قيمة فاصلة، وbreak وcontinue، وتجنّب الحلقات اللانهائية.

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

حين لا يكون لديك عدّاد

حلقة for مبنية حول عدّاد تضبطه مسبقًا. لكن كثيرًا من الحلقات لا يوجد لها عدد واضح: استمر في قراءة الأسطر حتى ينتهي الملف، استمر في طلب كلمة مرور حتى تصح، استمر في تنصيف عدد حتى يبلغ 1. لهذه الحالات تكون حلقة while هي الخيار الطبيعي - فهي تكرر فقط ما دام شرط يبقى صحيحًا.

تفحص حلقة while شرطها قبل كل مرور، بما في ذلك المرور الأول. فإن كان الشرط خاطئًا من البداية، لا يعمل الجسم على الإطلاق.

يُفحص الشرط count > 0 أولًا؛ فإن كان صحيحًا عمل الجسم؛ ثم نعود ونفحص مرة أخرى. السطر count-- هو ما يجعل الشرط خاطئًا في النهاية - أسقطه وستعمل الحلقة إلى الأبد.

تشريح حلقة while

قارنها بحلقة for الثلاثية الأجزاء التي تعرفها. تفصل حلقة while تلك المهام الثلاث: تنفّذ التهيئة قبل الحلقة، ويوضع الشرط في الأقواس، ويعيش التحديث داخل الجسم.

int i = 0;              // initialization - before the loop
while (i < 5) {         // condition - checked each pass
    System.out.println(i);
    i++;                // update - you must remember this yourself
}

ذلك الجزء الأخير هو المشكلة. في حلقة for يقع التحديث بجوار الشرط مباشرةً، فيصعب نسيانه. أما في حلقة while فهو مجرد عبارة أخرى في الجسم - وأكثر الأخطاء شيوعًا هو إغفاله وتعليق البرنامج.

do-while: شغّل الجسم مرة واحدة على الأقل

أحيانًا تحتاج إلى تشغيل الجسم مرة قبل أن تستطيع حتى تقرير ما إذا كنت ستكرر. تفحص حلقة do-while شرطها في الأسفل، لذا ينفَّذ الجسم دائمًا مرة واحدة على الأقل:

عليك أن تطلب الإدخال وتقرأه مرة واحدة على الأقل قبل أن تعرف ما إذا كان صالحًا، وهذا بالضبط ما تقدمه do-while. لاحظ الفاصلة المنقوطة بعد while (...) - فهي مطلوبة، ونسيانها خطأ ترجمة متكرر.

يظهر الفرق عن حلقة while العادية بوضوح حين يبدأ الشرط خاطئًا:

يُطبع do-while body فقط. تتخطى حلقة while جسمها كليًا لأن x < 5 كان خاطئًا قبل الفحص الأول.

التكرار حتى قيمة فاصلة

من الاستخدامات الكلاسيكية لـ while القراءة حتى قيمة "توقف" خاصة - قيمة فاصلة (sentinel). لا يوجد عدّاد هنا؛ تستمر فقط حتى تخبرك البيانات بأن تتوقف:

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

break و continue في حلقات while

تعمل break وcontinue هنا تمامًا كما في حلقة for. تغادر break الحلقة فورًا؛ وتقفز continue مباشرةً إلى فحص الشرط، متخطيةً بقية المرور الحالي:

يطبع هذا 1 3 5 7 9. تعمدت while (true) ألا تتوقف من تلقاء نفسها أبدًا - فـ break هي المخرج الوحيد. احذر من continue في حلقة while: لأن التحديث جزء من الجسم، فإن القفز إلى الأعلى بـ continue قبل أن تكون قد قدّمت عدّادك طريقة خفية لتعليق الحلقة. في المثال أعلاه تعمل n++ أولًا، لذا فهي آمنة.

احذر من الحلقات اللانهائية

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

int i = 0;
while (i < 5) {
    System.out.println(i);   // i never changes -> runs forever
}
int i = 0;
while (i != 10) {
    i += 3;   // 0, 3, 6, 9, 12... skips right past 10 -> runs forever
}

تتعلق الأولى لأن i لا تُحدَّث أبدًا. وتتعلق الثانية لأن العدّاد يتخطى القيمة الدقيقة التي يبحث عنها الشرط - فضّل < أو <= على != حين قد لا يقع التزايد على القيمة بالضبط. حلقة while (true) لا بأس بها إن كان لها break مضمون؛ أما العرضية منها فمجرد خطأ.

التالي: حلقة for-each

حلقة while هي الأداة المناسبة حين تكرر حتى يتغير شرط ولا يوجد عدد واضح. لكن حين تريد ببساطة زيارة كل عنصر في مصفوفة أو قائمة - بلا فهرس ولا شرط تديره - فهناك ما هو أنظف: حلقة for-each المحسّنة. تلك هي الصفحة التالية.

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

ما الفرق بين while و do-while في جافا؟

حلقة while تفحص شرطها قبل المرور الأول، لذا قد لا يعمل جسمها أي مرة. أما حلقة do-while فتُشغّل جسمها مرة أولًا، ثم تفحص الشرط في الأسفل - فتعمل دائمًا مرة واحدة على الأقل. استخدم do-while عندما يجب أن يحدث العمل قبل أن تستطيع تقرير ما إذا كنت ستكرر (مثل طلب إدخال ثم التحقق منه).

متى أستخدم حلقة while بدل حلقة for في جافا؟

استخدم حلقة while عندما لا يكون لديك عدّاد واضح وتريد فقط التكرار حتى يتغير شرط ما - قراءة الإدخال حتى يكتب المستخدم quit، أو الاستطلاع حتى تجهز قيمة، أو معالجة طابور حتى يفرغ. واستعن بحلقة for عندما تعرف عدد التكرارات أو يكون لديك فهرس واضح تعدّه.

كيف توقف حلقة while لانهائية في جافا؟

تأكد أن شيئًا ما داخل الجسم يجعل الشرط خاطئًا في النهاية (إنقاص عدّاد، تقديم مؤشر، ضبط راية). ولحلقة while (true) المقصودة، ضع break بداخلها محروسًا بـ if. إذا تعلّقت الحلقة فالسبب المعتاد هو نسيان تحديث المتغير الذي يعتمد عليه الشرط.

Coddy programming languages illustration

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

ابدأ الآن