در حال بارگذاری...

try و catch در Java

خواندن بدِ slots[5] را داخل try و catch بپیچید تا برنامه روی ArrayIndexOutOfBoundsException تمام نشود. داخل catch عبارت blocked را چاپ کنید، بعد بیرون از هر دو بلوک after را چاپ کنید. Guard.java را با javac Guard.java ترجمه کنید و java Guard را اجرا کنید. صفحه باید اول blocked و بعد after را نشان دهد. فایل دوم slots[0] را داخل try نگه می‌دارد تا catch رد شود و صفحه 2 و بعد after را نشان دهد. throw را برای صفحهٔ بعد بگذارید.

گرفتن ایندکس بد

صفحهٔ exceptions نشان داد چاپ slots[5] روی {2, 4} باعث پرتاب ArrayIndexOutOfBoundsException و توقف اجرا می‌شود. این صفحه همان داستان آرایه را نگه می‌دارد و مدیریت را اضافه می‌کند. فایل تدریس جدید را با نام Guard.java باز کنید. نام کلاس عمومی را Guard نگه دارید تا با نام فایل یکی باشد. mainهای باقی‌ماندهٔ Alarm که بدون catch می‌ایستند، لیست‌های Integer مربوط به Crate، و هر Scanner یا nextLine را پاک کنید. برنامه نباید منتظر تایپ بماند.
داخل main همان آرایهٔ کوچک را نگه دارید:
int[] slots = {2, 4};
چاپ بد را داخل try بگذارید:
System.out.println(slots[5]);
بعد یک catch بنویسید که ArrayIndexOutOfBoundsException را نام ببرد و blocked چاپ کند. بعد از کل try و catch، after را چاپ کنید. نام پارامتر catch می‌تواند حرف کوتاهی مثل e باشد؛ در این صفحه لازم نیست خودِ شیء استثنا را چاپ کنید.

Guard catch bad index

java
public class Guard {
    public static void main(String[] args) {
        int[] slots = {2, 4};
        try {
            System.out.println(slots[5]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("blocked");
        }
        System.out.println("after");
    }
}

از پوشه‌ای که Guard.java را نگه می‌دارد، javac Guard.java را اجرا کنید. وقتی پرانتزها، آکولادها و نقطه‌ویرگول‌ها جور باشند، خودِ javac سطری از خودش نمی‌نویسد. بعد java Guard را اجرا کنید — نه java Guard.java. پسوند .java را از فرمان اجرا بردارید.
صفحه blocked و بعد after را نشان می‌دهد. ایندکس بد هنوز داخل try پرتاب می‌کند. catch آن استثنای نام‌دار را مدیریت می‌کند و blocked چاپ می‌کند. خط System.out.println("after"); بیرون نشسته، پس باز هم اجرا می‌شود. برنامه مثل فایل بدِ لختِ Alarm روی آن توقف تمام نمی‌شود.
فرض کنید چاپ دومی هنوز داخل همان try بعد از slots[5] باشد، مثلاً خطی که rice چاپ کند. آن خط اجرا نمی‌شود. گرفتن استثنا بقیهٔ try را از نو تمام نمی‌کند. فقط بدنهٔ catch برای آن توقف اجرا می‌شود، بعد کنترل بعد از catch ادامه می‌یابد. این ایده را روشن نگه دارید: مدیریت، خط‌های باقی‌مانده داخل try بعد از نقطهٔ پرتاب را رد می‌کند.
اگر ترمینال منتظر ورودی صفحه‌کلید بماند، هنوز فراخوانی nextLine از تمرین قدیمی در فایل است. آن را پاک کنید. اگر فقط گزارش پشته می‌بینید و خط blocked نیست، catch نیست یا نام استثنا جور نیست. اگر فقط 2 می‌بینید و after نیست، شاید هنوز فایل امن قدیمی Alarm را اجرا می‌کنید — به java Guard با فایل تدریس catch بروید.

وقتی try تمام شود، catch ساکت می‌ماند

برنامهٔ دوم همان شکل try و catch را دارد، اما چاپ داخل try خانهٔ نوشته‌شده را می‌خواهد: slots[0]. همهٔ خط‌های داخل try تمام می‌شوند. بدنهٔ catch اجرا نمی‌شود.

Guard safe index skips catch

java
public class Guard {
    public static void main(String[] args) {
        int[] slots = {2, 4};
        try {
            System.out.println(slots[0]);
        } catch (ArrayIndexOutOfBoundsException e) {
            System.out.println("blocked");
        }
        System.out.println("after");
    }
}

با javac Guard.java ترجمه کنید، بعد java Guard را اجرا کنید. صفحه 2 و بعد after را نشان می‌دهد. واژهٔ blocked چاپ نمی‌شود، چون ArrayIndexOutOfBoundsException نبود. catch ساکت ماند. خط after باز هم اجرا می‌شود، چون بیرون از هر دو بلوک نشسته — همان جایی که در دموی catch داشت.
یک‌بار تضاد را راه بروید. فایل اول: ایندکس بد، catch چاپ blocked، بعد after. فایل دوم: ایندکس امن، catch رد شده، صفحه 2 بعد after. هر دو Guard و همان نام نوع catch را نگه می‌دارند. فقط ایندکس داخل try عوض می‌شود. همان یک تغییر کافی است تا ببینید catch کی اجرا می‌شود و کی نه.
در این صفحه throw اختراع نکنید. شما استثنایی را می‌گیرید که خواندن بدِ آرایه از قبل ایجاد می‌کند. صفحهٔ بعد دربارهٔ پرتاب عمدی است. همچنین امروز هر چاپ آرام دوره را داخل try نپیچید — این درس try را جایی می‌گذارد که ایندکس بدِ شناخته‌شده به مسیر مدیریت‌شده نیاز دارد.

نام catch باید جور باشد

بند catch یک نوع استثنا را نام می‌برد. در این صفحه آن نوع ArrayIndexOutOfBoundsException است و با ایندکس بد جور است. اگر به‌جایش دور slots[5] بنویسید catch (NullPointerException e)، آن catch توقف را مدیریت نمی‌کند. برنامه هنوز با ArrayIndexOutOfBoundsException تمام می‌شود و نه blocked و نه after برای آن catch ناجور چاپ نمی‌شود. در فایل‌های تدریس نوع جور را نگه دارید.
نام‌های استثنای دیگری در Java هست. این صفحه روی یک جفت روشن می‌ماند: ایندکس بدِ آرایه و ArrayIndexOutOfBoundsException. قبل از تمرین این شکل به کاتالوگ همهٔ نوع‌های قابل‌گرفتن نیاز ندارید. همان نامی را جور کنید که در صفحهٔ exceptions دیدید.

مقایسه با توقف لخت Alarm

در صفحهٔ exceptions، java Alarm با slots[5] ایستاد و گزارش پشته نشان داد. در این صفحه، java Guard با همان ایندکس بد blocked چاپ می‌کند و تا after ادامه می‌دهد. داستان آرایه عوض نشد. مدیریت عوض شد. اگر فایل‌های Alarm هنوز نزدیک‌اند فقط به‌عنوان تاریخ نگه دارید؛ برای دموهای catch با java Guard اجرا کنید تا صفحه با این درس یکی باشد.
تاریخ wrappers وقتی فایل قدیمی را نگه دارید هنوز 9 را از لیست Integer چاپ می‌کند. آن مسیر داستان catch نیست. دموهای باقی‌ماندهٔ ArrayList<Integer> را داخل Guard.java پاک کنید یا نادیده بگیرید تا فایل تدریس روی int[] slots به‌همراه try و catch بماند.

این صفحه برای throwing چه می‌گذارد

این صفحه استثنایی را می‌گیرد که یک خط از قبل به آن می‌خورد. صفحهٔ بعد throw را معرفی می‌کند تا خودتان مشکل را اعلام کنید. اینجا روی جور بودن catch و دیدن ادامهٔ after بمانید. هنوز throw دستی را به‌عنوان الزام روی این فایل‌های Guard اضافه نکنید.

پیش از throwing

می‌توانید ArrayIndexOutOfBoundsException را از slots[5] بگیرید و blocked بعد after ببینید. می‌توانید slots[0] را داخل try نگه دارید و 2 بعد after ببینید، با catch ردشده. Guard.java را ترجمه کنید و برای هر دموی نگهداشته‌شده java Guard را به‌نوبت اجرا کنید. نام catch با توقف ایندکس بد جور بود. صفحهٔ بعد throwing است، جایی که عمداً توقف می‌سازید.
دموی catch را برای مسیر مدیریت‌شده نگه دارید. try امن را برای رد آرام catch نگه دارید. throw دستی را از این صفحه دور نگه دارید. این سه عادت ایست بازرسی پیش از ادامه است. وقتی بعد از اجرای ایندکس بدِ java Guard اول blocked و بعد after ظاهر شد، try و catch کارشان را برای این درس تمام کرده‌اند و برای موضوع بعدی دربارهٔ throwing آماده‌اید.

🧠 دانش خود را بیازمایید

آماده شروع

دانش خود را بیازمایید

خود را با این آزمون تعاملی به چالش بکشید و ببینید موضوع را چقدر خوب درک کرده‌اید

❓
5
سوالات
🎯
70%
برای قبولی
♾️
∞
زمان
🔄
∞
تلاش‌ها

📝 دستورالعمل‌ها

  • هر سوال را با دقت بخوانید
  • بهترین پاسخ را برای هر سوال انتخاب کنید
  • می‌توانید آزمون را هر چند بار که می‌خواهید تکرار کنید
  • پیشرفت شما در بالا نمایش داده می‌شود