پرتاب استثنا در Java
توقف را خودتان با throw بنویسید. Signal.java را باز کنید و قبل از هر چاپ water، استثنای IllegalArgumentException را با پیام empty پرتاب کنید. با 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");
بعد چاپی نگه دارید که وقتی throw شلیک شود نباید اجرا شود:
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 بعد از آن throw اجرا نمیشود، چون برنامه از قبل ایستاده است. اگر بعد از throw داخل همان main یک System.out.println("water"); غیرقابلوصول نگه دارید، بعضی کامپایلرها هشدار میدهند که چاپ غیرقابلوصول است؛ ایدهٔ تدریس همان است: بعد از throw، خطهای عادی آن مسیر اجرا نمیشوند. اگر javac از کد غیرقابلوصول شکایت کرد، فایل پرتاب لخت بدون چاپ مرده را ترجیح دهید — خودِ توقف درس است.
اگر ترمینال منتظر ورودی صفحهکلید بماند، هنوز فراخوانی nextLine از تمرین قدیمی در فایل است. آن را پاک کنید. اگر blocked بعد after میبینید، هنوز فایل catch مربوط به Guard را اجرا میکنید — به java Signal بروید. اگر از slots[5] مقدار ArrayIndexOutOfBoundsException میبینید، باقیماندهٔ Alarm هنوز فعال است؛ برای این درس آن را با خط throw عوض کنید.
صفر فنجان وارد if میشود و پرتاب میکند
برنامهٔ دوم از نو شروع میکند. cups را 0 ذخیره کنید. اگر cups کمتر از 1 باشد، همان IllegalArgumentException را با پیام empty پرتاب کنید. بعد از if چاپ water را نگه دارید.
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 را تمرین میکند.
یکبار آکولادها را راه بروید. خط throw داخل بلوک if نشسته است. چاپ water بیرون if است. وقتی throw اجرا شود، برنامه از قبل ایستاده، پس water هرگز نمیرسد. تورفتگی و آکولادها هستند که throw را داخل شرط میگذارند.
سه فنجان throw را رد میکند و 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 چاپ میکند. توقفی نیست. آن تضاد ایست بازرسی است: throw فقط وقتی شلیک میشود که شرط بگوید مقدار قابلاستفاده نیست.
دور این فایلهای تدریس در این صفحه catch اختراع نکنید. catch را روی Guard از قبل تمرین کردید. اینجا باید توقفی را که نوشتید ببینید، و مسیری را که throw را رد میکند. همچنین برای فنجان خالی IllegalArgumentException را با ArrayIndexOutOfBoundsException عوض نکنید — آن نام مال ایندکس بدِ آرایه بود، نه بررسی مقداری که با throw خودتان نوشتید.
نامی که نوشتید
نوعی که پرتاب کردید IllegalArgumentException است، نه ArrayIndexOutOfBoundsException و نه واژهٔ لخت empty بهعنوان نوع. پیام empty چیزی است که کنار نام انتخاب کردید نشان داده شود. اگر بعداً این توقف را بگیرید، بند catch باید IllegalArgumentException را نام ببرد. catch برای NullPointerException آن را مدیریت نمیکند. تمرین آن catch امروز روی این فایلهای Signal لازم نیست.
IllegalArgumentException در استفادهٔ رایج مبتدی یک استثنای زمان اجراست، پس این دموهای کوچک main به بند throws روی main نیاز ندارند. روی همین یک نوع و پیام روشن بمانید. قبل از اینکه صفحهٔ بعد فایلی باز کند، به کاتالوگ همهٔ کلاسهای throwable نیاز ندارید.
مقایسه با catch روی Guard
در صفحهٔ try-catch، java Guard ایندکس بد را مدیریت کرد و تا after ادامه داد. در این صفحه، java Signal عمداً توقف میسازد و آن را نمیگیرد. داستان آرایه تاریخ است. اگر فایلهای Guard هنوز نزدیکاند فقط بهعنوان دموی قدیمی نگه دارید؛ برای دموهای throw با java Signal اجرا کنید تا صفحه با این درس یکی باشد.
این صفحه برای files چه میگذارد
این صفحه فقط نشان میدهد که با throw توقف میسازید. صفحهٔ بعد خواندن فایل را شروع میکند. اینجا روی نوشتن توقف و رد کردنش وقتی cups قابلاستفاده است بمانید. هنوز باز کردن فایل را بهعنوان الزام روی این دموهای Signal اضافه نکنید.
پیش از files
میتوانید IllegalArgumentException("empty") را پرتاب کنید و ببینید اجرا قبل از water میایستد. با cups برابر 0، if وارد میشود و همان توقف رخ میدهد. با cups برابر 3، throw اجرا نمیشود و صفحه water چاپ میکند. Signal.java را ترجمه کنید و برای هر دموی نگهداشتهشده java Signal را بهنوبت اجرا کنید. نام این توقف IllegalArgumentException است. صفحهٔ بعد خواندن فایل است.
پرتاب لخت را برای توقف روشنی که نوشتید نگه دارید. جفت cups را برای شرطی نگه دارید که میتواند throw را رد کند. خواندن فایل را از این صفحه دور نگه دارید. این سه عادت ایست بازرسی پیش از ادامه است. وقتی water فقط روی اجرای cups برابر سهِ java Signal ظاهر شد، throwing کارش را برای این درس تمام کرده و برای موضوع بعدی دربارهٔ فایلها آمادهاید.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود