الرمي في Java
اكتب أنت التوقف بنفسك بـ throw. افتح Signal.java وأرمِ IllegalArgumentException بالرسالة empty قبل أي طباعة لـ water. ترجم بـ javac Signal.java وشغّل java Signal. البرنامج يتوقف عند سطر throw؛ لا تُطبع water. عرض ثانٍ يضع cups عند 0 ليدخل if ويرمي. عرض ثالث يضع cups عند 3 ليتخطّى if وتطبع الشاشة water. اترك قراءة الملفات للصفحة التالية.
أنت تكتب التوقف
أظهرت الصفحات السابقة توقفًا ظهر لأن سطرًا كسر قاعدة — فهرس سيئ للمصفوفة رمى ArrayIndexOutOfBoundsException. هذه الصفحة الاتجاه الآخر. أنت تختار نوع الاستثناء وتكتب throw ليحدث التوقف عمدًا. افتح ملفًا تعليميًا اسمه Signal.java. أبقِ اسم الفئة العامة Signal ليطابق اسم الملف. احذف عروض catch المتبقية من Guard، وتوقفات مصفوفة Alarm المتبقية، وأي Scanner أو nextLine. يجب ألا ينتظر البرنامج الكتابة. هذه الصفحة لا تحتاج سطر import.
داخل main، أرمِ قبل أي طباعة هادئة للنجاح:
throw new IllegalArgumentException("empty");
ثم أبقِ طباعة لا ينبغي أن تعمل عندما يشتعل الرمي:
System.out.println("water");
الكلمات بين علامتي الاقتباس هي الرسالة. اسم النوع هو IllegalArgumentException. أنت لا تقسم على صفر ولا تقرأ slots[5]. التوقف موجود لأنك كتبت throw.
public class Signal {
public static void main(String[] args) {
throw new IllegalArgumentException("empty");
// water would not run after throw
}
}
من المجلد الذي يحوي Signal.java نفّذ javac Signal.java. عندما تتطابق الأقواس والأقواس المعقوفة والفواصل المنقوطة، لا يكتب javac سطرًا من عنده. ثم نفّذ java Signal — لا java Signal.java. احذف لاحقة .java من أمر التشغيل.
يتوقف التشغيل عند سطر throw. تسمي الطرفية IllegalArgumentException وتُظهر الرسالة empty. طباعة water بعد ذلك الرمي لا تعمل، لأن البرنامج توقف أصلًا. إن أبقيت System.out.println("water"); غير قابل للوصول بعد الرمي داخل نفس main، قد يحذّر بعض المترجمين أن الطباعة غير قابلة للوصول؛ الفكرة التعليمية تبقى: بعد throw، لا تجري الأسطر العادية في ذلك المسار. فضّل ملف الرمي العاري دون طباعة ميتة إن اشتكى javac من كود غير قابل للوصول — التوقف ذاته هو الدرس.
إذا انتظرت الطرفية إدخال لوحة المفاتيح، فما زال استدعاء nextLine من تمرين قديم في ملف. احذفه. إن رأيت blocked ثم after، فما زلت تشغّل ملف catch من Guard — انتقل إلى java Signal. إن رأيت ArrayIndexOutOfBoundsException من slots[5]، فبقايا Alarm ما زالت نشطة؛ استبدلها بسطر throw لهذا الدرس.
صفر cups يدخل if ويرمي
يبدأ برنامج ثانٍ من جديد. خزّن cups عند 0. إذا كان cups أقل من 1، أرمِ نفس IllegalArgumentException بالرسالة empty. أبقِ طباعة water بعد if.
public class Signal {
public static void main(String[] args) {
int cups = 0;
if (cups < 1) {
throw new IllegalArgumentException("empty");
}
System.out.println("water");
}
}
ترجم بـ javac Signal.java، ثم نفّذ java Signal. الصفر أقل من واحد، فيدخل if ويعمل throw. تُظهر الشاشة نفس التوقف: IllegalArgumentException وempty. لا تُطبع كلمة water. لا شيء في هذه الصفحة يلتقط التوقف، فينتهي البرنامج هناك. ذلك عمدي — الصفحة السابقة تدرّب catch؛ هذه الصفحة تدرّب كتابة الرمي.
امشِ الأقواس المعقوفة مرة. سطر throw داخل كتلة if. طباعة water خارج if. عندما يعمل throw، يكون البرنامج قد توقف أصلًا، فلا يُبلغ water أبدًا. المسافة البادئة والأقواس هي ما يضع الرمي داخل الفحص.
ثلاثة cups تتخطى الرمي وتطبع water
يبدأ برنامج ثالث من جديد أيضًا. اضبط cups على 3. أبقِ نفس if ونفس throw ونفس طباعة water.
public class Signal {
public static void main(String[] args) {
int cups = 3;
if (cups < 1) {
throw new IllegalArgumentException("empty");
}
System.out.println("water");
}
}
ترجم وشغّل مجددًا بـ javac Signal.java وjava Signal. الثلاثة ليست أقل من واحد، فلا يُدخل if. لا يعمل throw أبدًا. تطبع الشاشة water. لا توقف. ذلك التباين هو نقطة التفتيش: الرمي يشتعل فقط عندما يقول شرطك إن القيمة غير صالحة.
لا تخترع catch حول ملفات التدريس هذه في هذه الصفحة. لقد تدرّبت على catch على Guard. هنا تحتاج لرؤية التوقف الذي كتبته، ولرؤية المسار الذي يتخطى الرمي. ولا تستبدل IllegalArgumentException بـ ArrayIndexOutOfBoundsException لأجل cups فارغة — ذلك الاسم كان لفهرس مصفوفة سيئ، لا لفحص قيمة كتبتَه أنت بـ throw.
الاسم الذي كتبتَه
النوع الذي رميتَه هو IllegalArgumentException، لا ArrayIndexOutOfBoundsException ولا كلمة empty العارية كنوع. الرسالة empty هي ما اخترت إظهاره بجانب الاسم. إن أمسكت هذا التوقف لاحقًا، يجب أن يسمّي بند catch IllegalArgumentException. catch لـ NullPointerException لن يعالجه. تمرين ذلك الـ catch غير مطلوب على ملفات Signal اليوم.
IllegalArgumentException استثناء وقت تشغيل في الاستخدام الشائع للمبتدئين، لذا هذه العروض الصغيرة لـ main لا تحتاج بند throws على main. ابقَ مع هذا النوع والرسالة الواضحة. لا تحتاج كتالوج كل صنف قابل للرمي قبل أن تفتح الصفحة التالية ملفًا.
مقارنة بـ catch على Guard
في صفحة try-catch، تعامل java Guard مع فهرس سيئ وواصل إلى after. في هذه الصفحة، يسبب java Signal توقفًا عمدًا ولا يلتقطه. قصة المصفوفة أصبحت تاريخًا. أبقِ ملفات Guard فقط كعروض أقدم إن بقيت قريبة؛ شغّل java Signal لعروض الرمي لتطابق الشاشة هذا الدرس.
ما تتركه هذه الصفحة لـ files
تُظهر هذه الصفحة فقط أنك تسبب توقفًا بـ throw. تبدأ الصفحة التالية قراءة ملف. ابقَ مع كتابة التوقف وتخطيه عندما يكون cups صالحًا. لا تفتح ملفًا كمتطلب على عروض Signal هذه بعد.
قبل files
يمكنك رمي IllegalArgumentException("empty") ورؤية التشغيل يتوقف قبل water. مع cups عند 0، يدخل if ويحدث نفس التوقف. مع cups عند 3، لا يعمل throw وتطبع الشاشة water. ترجم Signal.java وشغّل java Signal لكل عرض محفوظ بالدور. اسم هذا التوقف هو IllegalArgumentException. الصفحة التالية هي قراءة ملف.
أبقِ الرمي العاري لتوضيح توقف كتبتَه. أبقِ زوج cups لشرط يمكنه تخطي الرمي. أبقِ قراءة الملفات خارج هذه الصفحة. تلك العادات الثلاث نقطة تفتيش قبل المتابعة. عندما يظهر water فقط في تشغيل cups عند ثلاثة لـ java Signal، أدّى الرمي عمله لهذا الدرس وأنت مستعد للموضوع التالي عن الملفات.
🧠 اختبر معرفتك
اختبر معرفتك
تحدى نفسك مع هذا الاختبار التفاعلي واكتشف مدى فهمك للموضوع
📝 التعليمات
- اقرأ كل سؤال بعناية
- اختر أفضل إجابة لكل سؤال
- يمكنك إعادة الاختبار عدة مرات كما تريد
- سيتم عرض تقدمك في الأعلى