استثناها در Java
یک آرایهٔ کوچک int بهنام slots که 2 و 4 دارد نگه دارید. slots[0] را چاپ کنید تا صفحه 2 نشان دهد. بعد ببینید اگر بهجای آن slots[5] بخواهید چه میشود: Java پرتاب میکند ArrayIndexOutOfBoundsException و برنامه میایستد. اول فایل امن را با Alarm.java کامپایل کنید و java Alarm را اجرا کنید. دیدن توقف زماناجرا از یک قانون شکسته — نه نقطهویرگول گمشده — کار این صفحه است. try و catch را برای صفحهٔ بعد بگذارید.
خواندن امنی که تمام میشود
استثنا راه Java برای گفتن این است که وقتی برنامه در حال اجرا بود قانونی شکست. تا حالا بیشتر دموها یک خط روشن چاپ میکردند و آرام تمام میشدند. این صفحه اول یک دموی آرام نگه میدارد، بعد یک دمو که با نام استثنا میایستد.
Alarm.java را باز کنید. نام کلاس public را Alarm نگه دارید تا با نام فایل یکی باشد. باقیماندهٔ ArrayList<Integer>، nums.add(9)، دموهای Crate و هر for-each روی oak و pine را پاک کنید. هر Scanner یا nextLine را هم پاک کنید. برنامه نباید منتظر تایپ بماند. این صفحه به خط import نیاز ندارد.
داخل main دو عدد صحیح ذخیره کنید:
int[] slots = {2, 4};
بعد خانهٔ اول را چاپ کنید:
System.out.println(slots[0]);
شمارهٔ خانهها از صفر شروع میشود. خانهٔ صفر مقدار 2 دارد. قبل از کامپایل ذخیره کنید.
public class Alarm {
public static void main(String[] args) {
int[] slots = {2, 4};
System.out.println(slots[0]);
}
}
از پوشهای که Alarm.java در آن است اجرا کنید javac Alarm.java. وقتی پرانتز و آکولاد و نقطهویرگول جور باشند، خودِ javac خطی نمینویسد. بعد java Alarm را بزنید — نه java Alarm.java. پسوند .java را از فرمان اجرا بردارید.
برنامه باید یک خط چاپ کند و بایستد: 2. منتظر تایپ شما نمیماند. اگر ترمینال منتظر ورودی صفحهکلید ماند، هنوز صدای nextLine از تمرین قدیمی در فایلی مانده است. آن را پاک کنید و آرایه بههمراه System.out.println(slots[0]); را نگه دارید.
یکبار اجرا را راه بروید. Java از Alarm.main شروع میکند. آرایه دو مقدار دارد. چاپ خانهٔ صفر را میخواند. صفحه 2 را نشان میدهد. چیز دیگری نباید چاپ شود. اگر 9 دیدید، هنوز دموی wrappers از Crate در حال اجراست — بروید سراغ java Alarm. اگر 4 دیدید، slots[1] را چاپ کردهاید؛ فایل امن درس slots[0] را نگه میدارد.
اندیس بدی که پرتاب میکند
فقط خط چاپ را عوض کنید تا خانهای را بخواهد که نوشته نشده: slots[5]. آرایه هنوز فقط دو خانه دارد. در زمان اجرا Java بهجای چاپ عدد یک استثنا پرتاب میکند.
public class Alarm {
public static void main(String[] args) {
int[] slots = {2, 4};
System.out.println(slots[5]);
}
}
با javac Alarm.java کامپایل کنید، بعد java Alarm را اجرا کنید. اینبار برنامه 2 چاپ نمیکند. ترمینال گزارشی نشان میدهد که نام ArrayIndexOutOfBoundsException را میآورد. اجرا میایستد. خطهایی که شاید بعد از آن چاپ تصور میکردید اجرا نمیشوند، چون استثنا مسیر عادی را قطع کرده است. توجه کنید javac ممکن است هنوز موفق باشد — اندیس بد مشکل زماناجرا است، نه نقطهویرگول گمشده.
همان توقف درس است. روی این صفحه اندیس را با try درست نمیکنید. یاد میگیرید بشناسید که قانون شکستهشده در زمان اجرا به استثنا تبدیل میشود و مسیر عادی را تمام میکند. نام استثنا را در گزارش بخوانید. فایل اندیسبد را فقط برای دیدن آن توقف نگه دارید. وقتی صفحهٔ آرام با 2 میخواهید، فایل امن را ترجیح دهید. اگر اندیس بد را دوباره به slots[0] برگردانید، صفحهٔ آرام برمیگردد؛ ثابت میکند توقف از اندیس آمده، نه از نام کلاس Alarm.
گزارش پشته را مثل نتیجهٔ عادی println نبینید. Java دارد میگوید چه اشتباه شده. املای نوع استثنا وقتی دربارهاش حرف میزنید مهم است: ArrayIndexOutOfBoundsException. فقط گفتن «خطا» برای این درس مبهم است — وقتی توقف را توصیف میکنید نام کامل نوع را نگه دارید.
باقیماندهٔ wrappers این crash نیست
فایل سوم لیست Integer صفحهٔ قبل را یادآوری میکند. آن دمو 9 چاپ میکند و تمام میشود. داستان استثنا نیست.
import java.util.ArrayList;
public class Alarm {
public static void main(String[] args) {
ArrayList<Integer> nums = new ArrayList<Integer>();
nums.add(9);
System.out.println(nums.get(0));
}
}
آن تضاد 9 چاپ میکند و بدون پرتاب تمام میشود. فقط برای جدا کردن مسیر تمامشدهٔ wrappers از مسیر اندیسبد Alarm بهکارش ببرید. برای درس exceptions این صفحه، جفت درس همان چاپ امن slots[0] و چاپ پرتابکنندهٔ slots[5] است. دور هیچکدام از دموهای آرایه روی این صفحه اصلاً try یا catch ننویسید.
در مقایسه با arrays و با wrappers
روی صفحهٔ arrays داخل خانههای نوشتهشده میماندید. این صفحه عمداً بیرون میزند تا استثنا را ببینید. روی صفحهٔ wrappers لیست Integer بدون crash مقدار 9 چاپ میکرد. آن بهعنوان تاریخچه هنوز کار میکند. برای این صفحه Alarm و داستان اندیس آرایه را نگه دارید.
استثناهای دیگر هم هستند — مثلاً تقسیم بر صفر میتواند ArithmeticException پرتاب کند. این صفحه یک نام روشن نگه میدارد: ArrayIndexOutOfBoundsException از اندیس بد. امروز به فهرست همهٔ نوعهای استثنا نیاز ندارید. قبل از صفحهٔ بعد که مدیریت را یاد میدهد، یک مثال محکم کافی است.
وقتی فایلهای قدیمی Crate.java هنوز نزدیکاند، اگر فرمان اجرا را گیج نمیکنند همان بگذارید، یا فقط وقتی گیج میکنند پاکشان کنید. بعد از کامپایل فایل دمویی که مد نظرتان است، java Alarm را اجرا کنید. عمداً فایل عوض کنید تا چاپ امن و چاپ پرتابکننده هنگام مطالعه در یک main قاطی نشوند.
چه چیزی برای try و catch میماند
این صفحه نشان میدهد استثنا میتواند برنامه را در زمان اجرا متوقف کند. صفحهٔ بعد try و catch را معرفی میکند تا بعضی مشکلها را بدون تمام کردن کل اجرا مدیریت کنید. اینجا با شناخت توقف و نام استثنا بمانید. هنوز روی این صفحه بلوک catch را الزام نکنید.
قبل از try و catch
میتوانید از {2, 4} مقدار slots[0] را چاپ کنید و 2 ببینید. میتوانید slots[5] را چاپ کنید و با ArrayIndexOutOfBoundsException توقف اجرا را ببینید. برای هر دموی نگه داشتهشده بهنوبت Alarm.java را کامپایل کنید و java Alarm را اجرا کنید. استثنا قانون شکستهشده را بهروشنی نام برد. صفحهٔ بعد try و catch است، جایی که مسیر مدیریتشده بعد از بعضی خطاها میتواند ادامه یابد.
دموی امن را برای صفحهٔ آرام نگه دارید. اندیس بد را برای دیدن توقف نگه دارید. try را از این صفحه دور نگه دارید. این سه عادت ایستگاه بازرسی قبل از رفتن جلو هستند. وقتی بعد از اجرای اندیس بد با java Alarm بتوانید ArrayIndexOutOfBoundsException را نام ببرید، exceptions کار این درس را کرده و برای موضوع بعد دربارهٔ مدیریت آمادهاید.
🧠 دانش خود را بیازمایید
دانش خود را بیازمایید
خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کردهاید
📝 دستورالعملها
- هر سوال را با دقت بخوانید
- بهترین پاسخ را برای هر سوال انتخاب کنید
- میتوانید آزمون را هر چند بار که میخواهید تکرار کنید
- پیشرفت شما در بالا نمایش داده میشود