آشنایی با انواع Exception ها در زبان جاوا


به طور کلی Exception ها را می توان به دو گروه اصلی Checked و Unchecked دسته بندی کرد. در واقع منظور از Checked Exception ها Exception هایی هستند که در حین Compile-time رخ می دهند که از آن جمله می توان به IOException و SQLException اشاره کرد. در واقع این دست از Error ها مشکلاتی هستند که به Syntax برنامه مرتبط هستند. مثلاً اگر به جای نوشتن int عبارت INT را بنویسیم، از آنجا که یک مشکل Syntax یی داریم بایستی انتظار مشکلی مرتبط با Compile time داشته باشیم. به طور کلی این دسته از Exception ها "حتماً" می بایست اصطلاحاً Handle شده یا مد نظر قرار داده شوند.

منظور از Unchecked Exception ها نوعی از Exception ها است که در حین Runtime رخ می دهندکه از آن جمله می توان به ArithmeticException و NullPointerException اشاره نمود. در واقع در این دست از مشکلات برنامه بدون هیچ مشکلی Compile می شود اما این در حالی است که در حین اجرای برنامه کاربر نتایج غیر قابل انتظاری مشاهده خواهد کرد و حتی ممکن است برنامه Crash هم بکند.

در حقیقت منظور از Compile-time این است که زمانیکه ما یک برنامه در زبان برنامه نویسی جاوا می نویسیم، کدهای ما می بایست به زبان ماشین تبدیل شوند و زمانیکه کدها به زبان ماشین تبدیل می شوند Compile-time نامیده می شود. حال پس از آنکه کدها به زمان ماشین تبدیل شدند و اصطلاحاً برنامه Compile شد، کاربر می تواند برنامه را اجرا کند و به زمانیکه کاربر یک برنامه را اجرا می کند Runtime گفته می شود.

پس از آنکه با مفاهیم Compile-time و Run-time در زبان برنامه نویسی جاوا آشنا شدیم در این بخش از آموزش به منظور بررسی دیگر انواع Exception ها کلاس های دیگری به پروژه خود اضافه می کنیم:

public class NullPointerException {
    public static void main(String[] args) {
        String s = null;
        System.out.println(s.length());
    }
}

همانطور که در کد فوق می بینیم کلاسی تحت عنوان NullPointerException ایجاد کرده ایم. سپس در متد main این کلاس یک شیئ از روی کلاس String تحت عنوان s ساخته ایم و مقدار اولیه آن را برابر با null قرار داده ایم. حال در دستور System.out.println با استفاده از متد length قصد داریم تعداد کاراکتر های شیئ ساخته شده از روی کلاس String را شمارش کنیم. برای همین منظور داخل پرانتز مرتبط با متد println نام شیئ ساخته شده از روی کلاس String را نوشته سپس یک نقطه قرار داده و متد length را به آن ضمیمه می کنیم. اکنون می توانیم برنامه خود را اجرا کنیم:

همانطور که در تصویر فوق می بینیم پس از اجرای برنامه با یک NullPointerException مواجه می شویم. علت مواجهه با چنین Exception یی این است که برای Object های ایجاد شده از روی کلاس String می بایست مقداری همچون یک عبارت یا یک کلمه در نظر گرفت که در این صورت اگر از متد length هم استفاده کنیم این متد تعداد کاراکترهای مرتبط با شیئ ساخته شده از روی کلاس String را خواهد شمارد اما از آنجا که در مثال فوق مقدار اولیه این کلاس را برابر با null قرار داده ایم حال اگر بخواهیم متد length را به شیئی ضمیمه کنیم که مقدار اولیه آن null است، برنامه ما با Exception یی از جنس NullPointerException رو به رو خواهد شد. چنانچه بخواهیم عبارت NullPointerException را به صورت تحت الفظی ترجمه کنیم می توانیم معادل "مشکلی که به خاطر اشاره به چیزی که تهی است ایجاد شده است" را در نظر بگیریم.

حال کلاس دیگری تحت عنوان NumberFormatException ایجاد می کنیم که از طریق آن Exception یی با نام NumberFormatException را مورد بررسی قرار خواهیم داد:

public class NumberFormatException {
    public static void main(String[] args) {
        String s = "Hello";
        int i = Integer.parseInt(s);
    }
}

همانطور که در کد فوق مشخص است شیئی تحت عنوان s از روی کلاس String ایجاد کرده و مقدار اولیه آن را برابر با Hello قرار می دهیم. سپس یک متغیر از جنس int تحت عنوان i ایجاد می کنیم و مقدار آن را برابر با متدی تحت عنوان parseInt که به کلاسی تحت عنوان Integer ضمیمه شده است قرار داده و شیئ ساخته شده از روی کلاس String را به عنوان پارامتر متد parseInt در نظر می گیریم.

همانطور که در آموزش های گذشته توضیح داده شد، به منظور تبدیل متغیرها به یکدیگر می توان از کلاس ها و متدهای مرتبط با آنها استفاده کرد. حال برنامه را اجرا می کنیم:

در واقع علت بروز چنین Exception یی این است که به هیچ وجه نمی توانیم یک شیئ از جنس کلاس String را به متغیری از جنس int تبدیل کنیم.

Exception دیگری که می خواهیم مورد بررسی قرار دهیم ArrayIndexOutOfBoundsException نام دارد. برای این منظور کلاسی با همین نام در پروژه خود ایجاد می کنیم و آن را به صورت زیر تکمیل می کنیم:

public class ArrayIndexOutOfBoundsException {
    public static void main(String[] args) {
        int[] numbers = new int[10];
        numbers[11] = 100;
    }
}

همانطور که در کد فوق می بینیم یک Array از جنس int ایجاد کرده ایم که numbers نام دارد. همانطور که مشخص است این Array قرار است 10 گزینه را در خود جای دهد. پس از تعریف این Array در خط دوم می بینیم که Array یی با شماره 11 را مد نظر قرار داده ایم و مقدار آن را برابر با عدد 100 در نظر گرفته ایم. حال برنامه را اجرا می کنیم:

همانطور که در تصویر فوق می بینیم برنامه ما با یک Exception از جنس ArrayIndexOutOfBoundsException رو به رو می شود و علت هم آن است که ما در Array خود فقط ده گزینه داریم اما در ادامه برنامه گزینه شماره یازده را هدف قرار داده ایم و از آنجا که این گزینه خارج از محدوده تعریف شده برای این Array است با چنین Exception یی رو به رو خواهیم شد.

لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
کاربر میهمان
کاربر میهمان
از آقای مرادی عزیز بخاطر آموزشهای عالی و بیان سادشون یک دنیا متشکرم ؛ همچنین از آقای دوشیری دوست داشتنی بابت پشتیبانی بی نهایت سپاسگزارم.
nahid
nahid
تشکر از آموزشهای خوب شما .بسیار مفید
کاربر میهمان
کاربر میهمان
فوق العاده بود
واقعا مچكرم
کاربر میهمان
کاربر میهمان
آقا دمتون گرم هیچ جا توی سایت نمیشه یه آموزش جاوا پیدا کردن خیلی عالی بود دمتون گرم
mj.alijani
mj.alijani
از سایت و مدرس جاوا تون خیلی ممنونم ای کاش نتیجه زحماتتونو ببینین 3> 3>
کاربر میهمان
کاربر میهمان
درواقع چون نوع استرینگ ما عددی نیست(در این مثال شما Hello هست ) نمیشه تبدیل کرد.... در صورتی که اگر به جای کلمه Hello عدد 123 رو داخل دابل کوتیشن قرار بدیم بدون هیچ مشکلی تبدیل میشه !
حسین
حسین
با تشکر بینهایت از شما دوستان عزیز،آقایان سینا دوشیری و بهزاد مرادی. منم امروز تا اینجای آموزش هاتون رو خوب فهمیدم در صورتیکه مثلا کتاب جاوا در 21 روز من رو از این زبان بیزار کرده بود،با آموزش های عالیتون حسابی می خوام روی این زبان و آندروید عزیز کار کنم! بابت وقتی که گذاشتید ممنون. همیشه موفق و شاد باشید...
Sina Deuxshiri
Sina Deuxshiri
سلام
خوشحالم که این آموزش ها کمک کرده. البته تمام زحمات نوشتن این آموزش ها رو آقای مرادی کشیدن. باید از ایشون ممنون باشیم. موفق باشید.

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام لطفا کمک کنید یه جا گیر کردم من هنگام ساخت پروژه اندروید در اکلیپس هنگام انتخاب ورژن اندروید برای من اندروید 6 میاد چطوری اندروید 2یا 4 رو دانلود کنم
کاربر میهمان
کاربر میهمان
سلام من جاوا رو تموم کردم و استودیو اندروید رو نصب کردم و یه خواهش از شما دارم ...اگه اخرین نسخه استودیو اندروید رو ببینید خیلی پیشرفت داشته و خیلی اسونتر از اکلیپس میتونیم برنامه ها رو بسازیم و لطف کنید با اموزش ساخت برنامه با استودیو اندروید رو بذارید ... ممنون
کاربر میهمان
کاربر میهمان
و با cmd اونها رو اجرا میکردیم
Sina Deuxshiri
Sina Deuxshiri
سلام
بله. اما یادم نیست که کدوم مبحث بود :(

در پاسخ به

کاربر میهمان
کاربر میهمان
یه مبحثی بود درباره ی jvm که با notpad کدهای جاوا رو بنویسیم
کاربر میهمان
کاربر میهمان
سلام خسته نباشید ... یه سوال داشتم قبلا مبحث JVM رو گذتشته بودید ولی الان نیس خواستم بدونم احتیاجی نیس بخونم
Sina Deuxshiri
Sina Deuxshiri
سلام
نمی دونم کدوم مبحث و میگین. اگه دقیق اسم آموزش و بگین بتون می گم.

در پاسخ به

ApA
ApA
باسلام و تشکر از آموزش های عالیتون
من امروز برنامه نویسی جاوا رو تموم کردم.فقط یک خواهشی داشتم و آن هم این است که در مورد اینترفیس ها و ترد ها یکمی بیشتر توضیح بدید.یکم مطالب اینترفیس ها و ترد ها گنگ است.
بازهم تشکر
Sina Deuxshiri
Sina Deuxshiri
سلام
ترد ها که مبحث گسرده ایه و تا حدودی، یکم بفهمی نفهمی سخته. در کل ترد ها یا چند نخی در مورد اجرای همزمان دو یا بیشتر از دو کار در برنامه نویسی هست. یعنی می تونید تردهایی و بسازید که هرکدوم به صورت مستقل کاره خاصی و انجام بدن. بهتره که وقتی مبحث ترد ها رو خوندید، یه نگاهی گذرا به مفاهیم سیستم عامل بکنید و با اجرای برنامه ها توسط سی پی یو آشنا بشید. خیلی جالبه.
اینترفیس هم که یکی از مفاهیم مربوط به شی گرایی هست. اینترفیس یه کلاسی از جاواست، با این تفاوت که تمام متد هایی که در این کلاس تعریف میشه همگی ابسترکت هستند و باید توسط کلاسی که این اینترفیس و پیاده سازی می کنه، اون متد ها رو هم پیاده سازی کنه. در جاوا بر خلاف سی پلاس پلاس ارث بری چند گانه وجود نداره. یعنی شما فقط می تونید از یک کلاس ارث بری کنید که این کار هم خوبه و هم بد. اما به نوعی میشه گفت که وجود اینترفیس ها در جاوا این خلا (عدم ارث بری چنگانه) و پر کرده و شما می تونید از هر تعداد اینترفیسی که می خواین در کلاستون پیاده سازی کنید.

در پاسخ به

عیسی پور
عیسی پور
توضیح مفیدی بود مثال خوبی زدید
ممنون جناب دوشیری

در پاسخ به

کاربر میهمان
کاربر میهمان
من دنبال throw می گردم مربوط به این بخش ولی پیداش نمیکنم. ممنون میشم راهنمایی کنید.
Sina Deuxshiri
Sina Deuxshiri
سلام
در این آموزش از throw استفاده نکرده. فقط بعضی از اکسپشن ها بررسی شده.

در پاسخ به

کاربر میهمان
کاربر میهمان
سلام و خسته نباشید به شما
واقعا آموزش هایی که گذاشتید بسیار عالی بود و از همه مهمتر اینکه اگه سوالی داشتیم در کمترین زمان جواب میدادید که خود همین موضوع خیلی با ارزشه
بازهم تشکر
کاربر میهمان
کاربر میهمان
آقای مرادی عزیز واقعا ازتون متشکرم که این آموزش عالی رو در اختیارم قرار دادید.خییییلی خییییلی عالی بود.خسته نباشید.
بهزاد مرادی
بهزاد مرادی
قابل شما رو نداشت!

در پاسخ به

کاربر میهمان
کاربر میهمان
vaghean tozihatetun aali bud kamel o mofid va b zabane ghabele fahm...khaste nabashid
کاربر میهمان
کاربر میهمان
خیلی عالی بود متشکرمممممممم
AliJCVD
AliJCVD
سلام...امروز من اموزش های خوبه جاوا رو از سایت شما تموم کرم :)....واقعا خدا خیرتون بده که همچین اموزش های خوبی رو رایگان قرار دادید! هم چنین یه خسته نباشید میگم و تشکر ویژه از استاد مرادی بخاطر این سری اموزش عالیشون دارم!
بنده هدفم یادگیری برنامه نویسی اندرویده! میخواستم بدونم اموزش های فصل 15رو لازم هست که بخونم یا دیگه میتونم برای اندروید شروع کنم!؟
ممنونم میشم راهنمایی کنید
ادمین سایت
ادمین سایت
سلام
ممنون از شما
فصل ۱۵ نیازی نیست

در پاسخ به

amindrh
amindrh
دمتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتتون
گرررررررررررررررررررررررررررررررررررررررررررررررررررررررررم

در پاسخ به