بررسی انواع ارورها در زبان برنامه نویسی جاوا


پس از آشنایی با مفاهیم شیئ گرایی در برنامه نویسی، مسئله ای که می تواند برای برنامه نویسان مبتدی مفید واقع شود را مطرح خواهیم که عبارت است از Error هایی که ما در برنامه نویسی با آن ها مواجه خواهیم شد.

ارورها در زبان برنامه نویسی جاوا به چند دسته تقسیم می شوند: گروه اول ارورهایی هستند که از نوع Compile-time Error می باشند. به طور مثال دستور ;()system.out.println در مقایسه با ;()System.out.println اشتباه است چرا که حرف اول واژه system به صورت کوچک نوشته شده است و همین مسئله موجب می گردد که برنامه کامپایل نشود. خبر امیدوار کننده اینجا است که این گروه از مشکلات توسط نرم افزار اکلیپس که برنامه خود را با آن می نویسیم تشخیص داده شده و به ما اخطار داده می شوند و به سادگی می توان آن را رفع کرد. برای روشن شدن این مطلب به ذکر چند مثال تصویری به همراه توضیحات خواهیم پرداخت.

همان طور که در آموزش های قبلی فرا گرفتیم، پروژه ای در محیط برنامه نویسی جاوا ایجاد کرده و یک کلاس با نام CompileTimeErrors یا هر نام دیگری در آن ایجاد می کنیم (فقط به خاطر داشته باشیم که نام کلاس ما با نام فایل java. که می سازیم دقیقاً یکی باشد که در غیر این صورت برنامه ما با مشکل مواجه خواهد شد.) پس از ایجاد پروژه، می بایست کدی مشابه کد زیر داشته باشیم:

public class CompileTimeErrors {
    /**
    * @param args
    */
    public static void main(String[] args) {
    // TODO Auto-generated method stub
    }
}

در ادامه می خواهیم جمله This is a Compile time error را داخل کنسول نمایش دهیم پس می بایست کد خود را به شکل زیر ویرایش نماییم (لازم به ذکر است که کامنت های کد که هیچ تاثیری در نحوه ی اجرای برنامه ما ندارند را حذف می کنیم):

public class CompileTimeErrors {
    public static void main(String[] args) {
        System.out.println("This is a Compile time error");
    }
}

در واقع کد فوق یک برنامه کامل و صحیح جاوا است که بدون هیچ مشکلی اجرا خواهد شد. در این جا ما قصد داریم تا عمداً تغییری در کد ایجاد کنیم تا کامپایلر از ما ایراد بگیرد. به همین منظور واژه out که می بایست حتماً با حروف کوچک نوشته شود را به صورت OUT می نویسیم. به محض این که ما واژه ی out را به OUT تغییر دهیم و برنامه را مجدد کامپایل کنیم، با خروجی زیر مواجه خواهیم شد:

ما در تصویر فوق از روی دو مورد می توانیم متوجه شویم که برنامه ما دارای ارور است. محیط برنامه نویسی اکلیپس دور واژه ی مشکل زا که در اینجا OUT است یک نقطه چین قرار داده است. از سوی دیگر در کنار نام فایل CompileTimeError.java علامت هشداری مشاهده می شود که نشانگر ایرادی در برنامه است. حال با قرار دادن نشانگر موس خود روی واژه OUT اکلیپس پیامی را به ما نشان می دهد که به شکل زیر است:

این یکی از بخش های لذت بخش کار کردن با نرم افزار اکلیپس است. این محیط برنامه نویسی قدرتمند مشکل را پیدا کرده و در جهت رفع آن تعدادی پیشنهاد می دهد (در اینجا صرفاً یک پیشنهاد بیشتر به ما نمی دهد چرا که مشکل خیلی پیچیده نیست!) چنانچه به خط آبی رنگ توجه کنیم، می بینیم که به ما پیشنهاد می شود که واژه OUT را به out تغییر دهیم که با این کار مشکل ما رفع خواهد شد. لازم به ذکر است که مثال فوق به منزله یکی از ساده ترین انواع ارورها در زبان برنامه نویسی جاوا است. در واقع یکسری از ارورها هستند که تا حدودی پیچیده تر اند و اکلیپس برای رفع مشکل، بیش از یک مورد به ما پیشنهاد می دهد که در چنین حالتی کار ما به عنوان برنامه نویس این است که تک تک پیشنهادات را مورد بررسی قرار داده و سپس تغییر مورد نیاز را اعمال کنیم.

نوع دیگر از ارورها تحت عنوان Unchecked Runtime Exception شناخته می شوند. در این صورت ما هیچ گونه Compile-time Error نداریم اما برنامه هم به طور کامل اجرا نمی شود. در واقع برنامه ای که ما نوشته ایم کاری را از جاوا می خواهد انجام دهد که جاوا از انجام آن ناتوان است. به طور مثال فرض کنیم که ما یک متغییر از جنس int داریم که مقدار اختصاص داده شده به آن 1,000,000 است. در حین نوشتن برنامه ما با هیچ گونه مشکلی مواجه نخواهیم شد اما به محض اینکه اقدام به کامپایل کردن برنامه می کنیم، ارور دریافت می کنیم. در مثال فوق اشکال کار در اینجا است که ما مابین ارقام یک کاما قرار داده ایم از این رو جاوا قادر به کامپایل کردن برنامه نخواهد بود. به منظور رفع این مشکل می بایست عدد فوق را به 1000000 تبدیل کنیم. در حقیقت نرم افزار اکلیپس از درک اینکه این مسئله می تواند در حین اجرا مشکل زا باشد عاجز است (در نت بینز اجازه تعریف همچین مقداری به کاربر داده نمی شود و خطا می دهد.)

برای روشن تر شدن این مسئله مثالی از دنیای واقعی می زنیم. فرض کنیم که شما از شخصی آدرس می پرسید. آن شخص به شما می گوید که مستقیم بروید تا به یک چهار راه برسید سپس به سمت راست بروید و رو به روی شما یک سینما قرار دارد. حال شما همان طور که آن شخص گفت مسیر را طی می کنید. مستقیم می روید. به چهار راه که رسیدید به سمت راست می روید. به رو به رو که نگاه می کنید به جای یک سینما یک دیوار سیمانی رو به روی شما قرار دارد! به عبارت دیگر شما از اول نمی دانستید که آدرسی که به شما داده شده است اشتباه است. زمانی که اینگونه ارورها اتفاق می افتند نیز قضیه به همین شکل است. از بدو امر جاوا نمی داند که در حین اجرای برنامه در وسط کار مشکلی قرار است اتفاق افتد از همین رو نمی تواند پیش بینی کند که برنامه در حین کامپایل شدن با مشکل مواجه خواهد شد.

دسته دیگری از ارورها از نوع Logical یا منطقی هستند. در چنین مواقعی نرم افزار اکلیپس هیچ گونه خطایی را نشان نخواهد داد و برنامه هم به طور کامل اجرا خواهد شد اما پاسخی که نرم افزار قرار بود به ما بدهد صحیح نیست. فرض کنیم در مثال فوق شخصی که به ما آدرس می دهد به جای این که به ما بگوید به سمت راست برویم بگوید که به سمت چپ برویم. این دسته از ارورها به منزله چالش بر انگیزترین ارورهای موجود در برنامه نویسی می باشند به طوری که رفع کردن آن ها هم ممکن است با دشواری زیادی همراه باشد (شاید مجبور باشید هفته ها وقت صرف کنید تا مشکل را بیابید!) نکته ای که بایستی مد نظر قرار داده شود این است که بسیاری از این دست از ارورها در بیشتر مواقع اصلاً مورد توجه قرار نمی گیرند و در آینده مشکلات زیادی را برای برنامه نویس به بار خواهند آورد.

دسته آخر از ارورها که بهتر است نام آن ها را ارور نگذاریم بلکه آن ها را Warning یا هشدار بنامیم تحت عنوان Compile-time Warning شناخته می شوند. به طور کلی این دسته از هشدارها به مهمی ارورها نمی باشند. در واقع زمانی که محیط برنامه نویسی اکلیپس شاهد مسئله مشکوکی باشد، یک آیکون زرد رنگ با علامت تعجب مقابل خطی که به آن مشکوک است نمایش می دهد. به مثال زیر توجه فرمایید:

در مثال فوق، ما یک متغییر از جنس عدد صحیح یا int ایجاد کرده ایم که نام آن test است و مقداری معادل با 100 هم برای آن در نظر گرفته ایم. در مقابل خطی که متغییر در آن قرار دارد یک علامت زرد رنگ با یک علامت تعجب قرار دارد. به عبارت دیگر، این یک هشدار از طرف نرم افزار اکلیپس است که می خواهد به ما بگوید که این متغیر در هیچ کجای برنامه مورد استفاده قرار نگرفته است و دیگر این که آیا مطمئن هستید که می خواهید این متغیر را در سورس کد خود نگه دارید. در حقیقت، هر موقع که ما با چنین هشدارهایی مواجه شویم می توانیم نشانگر موس خود را روی آن علامت زرد رنگ نگه داشته و پیشنهادی که اکلیپس به ما می دهد را مطالعه کنیم. به تصویر زیر توجه کنید:

نوشته ای که در قسمت زرد رنگ دیده می شود حاکی از آن است که مقدار متغیری تحت عنوان test در هیچ کجای برنامه مورد استفاده قرار نگرفته است.

به خاطر داشته باشید
به طور کلی مشکلات برنامه نویسی اصطلاحاً Bug نامیده می شوند و فرایند مشکل یابی و رفع آن ها اصطلاحاً Debugging نامیده می شود که تسلط به Debugging خیلی می تواند ما را در برنامه نویسی کمک کند.
لیست نظرات
کاربر میهمان
دیدگاه شما چیست؟
کاربر میهمان
swpkadl
swpkadl
۱۳۹۶/۱۱/۱۸
سلام این علامت تعجب قرمز رنگ چیه چطور میشه خطاش را برطرف کرد این علامت تعجب قرمز بدون لامپ است
مثلا من این کد رو می نویسم
; i = /2 ! این علامت رو میاره
تو رو خدا کمک کنید
کاربر میهمان
کاربر میهمان
۱۳۹۶/۰۸/۰۷
سلام‌خسته نباشید کتابی فارسی برای برنامه نویسی جاوا میتونید معرفی کنید
مطالبتونم‌خوبن ممنون بابتشون
Lemony
Lemony
۱۳۹۶/۰۴/۲۴
توضیحاتتون فوق العاده هست و هر کسی و با هر سنی متوجه میشه
ممنون از سایت خوبتون
Amin
Amin
۱۳۹۶/۰۴/۰۶
عالی
Amin
Amin
۱۳۹۶/۰۴/۰۶
عالی
fighter
fighter
۱۳۹۶/۰۳/۲۸
در خط دوم : مطرح خواهیم کرد : درست شود
کاربر میهمان
کاربر میهمان
۱۳۹۵/۱۲/۲۶
آقای مرادی خیلی مردی..
فقط همینو میتونم بگم..
کاربر میهمان
کاربر میهمان
۱۳۹۵/۰۷/۲۸
موفق و موید باشید، بسیار عالی و روان هست مطالب
saeedprz
saeedprz
۱۳۹۵/۰۷/۰۱
وججججدانا باورش مشکل همچین اموزشی مجانی باشه. دمیون گرم
به آمد
به آمد
۱۳۹۵/۰۴/۰۴
کاش pdf مطالب رو هم میزاشتین ...
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۵/۰۴/۰۴
سلام. امکان قرار دادن آموزش‌ها به صورت PDF وجود نداره. مگر اینکه خودتون به PDF صفحه‌ی سایت و ذخیره کنید.

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۵/۰۳/۱۷
https://codefights.com/
یه سایت خوب برای پیدا کردن باگ توی کد ها
hamid_r_9750
hamid_r_9750
۱۳۹۵/۰۲/۱۸
ممنون از آموزشتون.فک نمیکردم جذب این برنامه بشم.
javad
javad
۱۳۹۵/۰۱/۲۳
آقا بازم سپاسگذارم
کاربر میهمان
کاربر میهمان
۱۳۹۵/۰۱/۰۸
این نوع آموزش همتا نداره فوق العادس
خسته نباشید
دستمریزاد
امیر
امیر
۱۳۹۴/۱۱/۲۴
درود و رحمت خداوند بر پدر و مادر برنامه ریزان و مدیران این وب سایت آموزشی که چنین فرزندان آینده نگر و پاک سرشت تحویل جامعه داده اند ...
واقعا دست مریزاد و خدا قوت که این قدر قشنگ و آموزنده مطالب برنامه نویسی رو با مثالهای کاربردی و به صورت رایگان در اختیار جوانان این مرز و بوم قرار میدهید . بنده از کلیه علم آموزان و دانشجویان عزیز که این متن رو میخونند تقاضا مندم که در جهت جبران این لطف ارزنده ، که به صورت رایگان خدمات میدهند یک فاتحه و 14 صلوات به روح اموات دست اندرکاران سایت سکان آکادمی هدیه بدهیم ... این کمترین کاری هست که میتونیم انجام بدهیم
...اللهم صل علی محمد و آل محمد و عجل فرجهم
بهزاد مرادی
بهزاد مرادی
۱۳۹۴/۱۱/۲۵
امیر جان سلام
این بهترین جبرانی است که می توانست اتفاق بیفتد.
ممنون

در پاسخ به

ادمین سایت
ادمین سایت
۱۳۹۴/۱۱/۲۵
سلام و درود بر شما کاربر گرامی
انرژی مثبت شما این دلگرمی را به اعضای سکان آکادمی خواهد داد تا با انرژی بیشتری به تولید علم برای علاقمندان بپردازیم.

با تشکر
ارادتمند
تیم سکان آکادمی

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۴/۱۰/۲۰
سلام این اخرین اختار من هروقت منغیر ساختم میده و حتی وقتی بازم متغیر به کار میگیرم درست نمیشه و کار نمیکنه مگه اینکه یکی از پیشنهاد های برنامه به اسم convert local variable to field بزنم چرا؟!
Sina Deuxshiri
Sina Deuxshiri
۱۳۹۴/۱۰/۲۱
سلام
با توجه به پیشنهاد IDE شما باید متغیرتون و عمومی یا Global تعریف کنید. حالا باز هم یه عکس از کدتون قرار بدین تا بهتر بتونم راهنماییم کنم.

در پاسخ به

عیسی پور
عیسی پور
۱۳۹۴/۰۹/۰۷
خدا خیرتون بده
هیچ جا مثل شما توضیح ندادن انصافا سایتتون تکه
موفق و پایدار باشید
ادمین سایت
ادمین سایت
۱۳۹۴/۰۹/۰۷
سلام
نظر لطف شماست

ارادتمند
تیم سکان آکادمی

در پاسخ به

کاربر میهمان
کاربر میهمان
۱۳۹۴/۰۸/۲۸
سپاس فراوان
mohamad reza rostmi
mohamad reza rostmi
۱۳۹۴/۰۸/۱۶
توضیحات عالی و جامع
Deijio Delavega
Deijio Delavega
۱۳۹۴/۰۷/۲۶
واقعا خیلی عالی مطالب رو توضیح میدین و مورد را روشن میکنید. متشکرم
AliJCVD
AliJCVD
۱۳۹۴/۰۷/۱۱
اقا خدا خیرتون بده واقعا خیلی عالی مطالب رو توضیح میدین و برای خواننده روشن میکنید. خیلی ممنون
ادمین سایت
ادمین سایت
۱۳۹۴/۰۷/۱۲
نظر لطف شماست

در پاسخ به