آموزش exception ها در جاوا

آموزش exception در جاوا
تاریخ بروزرسانی : 10 شهریور 1399 | تعداد بازدید : 7136 | زمان خواندن مقاله : 10 دقیقه
جاوا،
با سلام خدمت همراهان و دوستداران آکامی آنلاین درسمن؛ در این مطلب می خواهیم درباره اهمیت آموزش exception در جاوا با شما دوستان صحبت کنیم. حتما برای شما هم این اتفاق افتاده است، زمانی که دارید برنامه نویسی میکنید قطعه کد شما اجرا نشود و با خطا روبه رو شوید. این خطاها ممکن است شما را کلافه کرده و ندانید که اشکال کار کجاست؟
اما باید بگویم اصلا ناراحت نباشید چون برنامه نویسی یعنی خطا کردن و تلاش برای پیدا کردن راهی مناسب برای رسیدن به جواب.
این خطاهایی که کمی کلافه کننده و حوصله سربر هستند اکسپشن نام دارد که اگر آنها را بشناسید، نحوه رفع  خطاها برایتان آسان تر میشود.
 

اکسپشن چیست؟

بهتر است قبل از هر چیز شما را با واژه اکسپشن آشنا کنم. در واقع اکسپشن یک مشکل است که در طول اجرای یک برنامه رخ میدهد و جریان طبیعی برنامه را متوقف میکند و برنامه به طور خودکار پایان می یابد. همهی کلاس های Exception  از کلاس java.lang.Exception  ارث بری میکنند. در ادامه با چگونگی کار با اکسپشن و همچنین مدیریت آنها آشنا می شویم.

دلایل رخداد exception  ها:

  1. کاربر یک داده نامعتبر وارد کرده است.
  2. یک فایل که نیاز به باز شدن دارد پیدا نشود.
  3. اتصال شبکه در وسط ارتباط گم شده است یا JVM از حافظه خارج شده است.

آموزش جاوا

انواع خطاها:


با دانستن دلایل رخداد یک اکسپشن میتوان به طور کلی خطاها را به دو دسته تقسیم کرد: خطاهای زمان کامپایل و خطاهای زمان اجرا که در ادامه به توضیح آنها خواهیم پراخت.
 

خطای زمان کامپایل :(Compile-Time Error)


احتمالا در روند یادگیری جاوا با این خطا بارها مواجه شدید. این خطا در اثر درست ‌ننوشتن کدهای برنامه رخ می‌دهد. مثلا اگر در پایان دستورها علامت ; را قرار ندهید این یک خطای زمان کامپایل محسوب می‌شود. چون این نوع خطاها هنگام کامپایل برنامه و قبل از اجرای آن تشخیص داده می شوند به آن‌ها خطای زمان کامپایل گفته می‌شود. تمام  ideهای جاوا که امروزه وجود دارند خطای زمان کامپایل را در همان لحظه رخداد به برنامه ‌نویس اطلاع می‌دهند. به عنوان مثال در ایکلیپس(Eclips) خطاهای زمان کامپایل با خط قرمزی که زیر کد کشیده می‌شود، مشخص می‌شوند.

نکته: به خطاهای زمان کامپایل خطای سینتکس یا خطای نحوی (Syntax Error) نیز گفته می‌شود.


خطای زمان اجرا :(Runtime Error)


تشخیص خطاهای زمان اجرا دشوارتر از تشخیص خطاهای نحوی است. این نوع خطاها تا قبل از اجرای برنامه و رسیدن به کدی که باعث بروز خطا می‌شود قابل تشخیص نیستند و به همین دلیل به آن خطای زمان اجرا گفته می‌شود. یعنی این نوع خطاها در طول اجرای برنامه رخ می‌دهند.
به کد زیر دقت کنید:
int[] nums = {1, 2, 3};

System.out.println(nums[3]);
این کد در ظاهر هیچ مشکلی ندارد و هیچ خطای دستوری هم در آن وجود ندارد اما در دستور چاپ سعی شده عنصری از آرایه nums  با شماره اندیس ۳  پیدا شود و همانطور که مشخص است اندیس آخرین عنصر این آرایه ۲ است و عنصری با اندیس ۳ وجود ندارد. به دلیل اینکه اندازه آرایه ‌ها هنگام کامپایل مشخص نیست (چون ممکن است اندازه یک آرایه توسط کاربر به عنوان ورودی به برنامه تعیین شود) پس کامپایلر این مشکل را نمی‌فهمد و خطای زمان کامپایل رخ نمی‌دهد بلکه هنگام اجرای برنامه وقتی برنامه به این کد رسید یک خطای زمان اجرا رخ می‌دهد. اگر کد بالا را اجرا کنید برنامه متوقف شده و خطایی تحت عنوان  ArrayIndexOutOfBoundsException  رخ می‌دهد.
 

بیشتر بخوانید: جاوا اف ایکس چیست و چه کاربردی دارد؟ در این مقاله با پلتفرم FX  آشنا می شویدsmiley

 

چگونگی رفع اکسپشن در برنامه:

بعد از تشخیص انواع خطاها نوبت آن است که بدانیم  چگونه آنها را مدیریت کنیم. برای این که بتوانیم  هنگام وقوع یک exception، آن را تشخیص داده و عمل خاصی را انجام دهیم از کلمات کلیدی try, catch استفاده می کنیم. Try, catch اسم بلوک های کد است که برای مدیریت exception ها به کار می رود. کدهایی را که ممکن است exception تولید کنند را داخل بلوک try قرار می دهیم و عمل مربوط به هرکدام از exception ها را داخل بلوک های catch می نویسیم. در واقع در قسمت try میگوییم یا همه خطوط اجرا شود و یا هیچ کدام ازخطوط اجرا نشود.
 
نحوه نوشتن و استفاده از این بلوک ها در برنامه جاوا به شکل زیر خواهد بود:

Try

{

   //Protected code

}catch(ExceptionName e1)

{

   //Catch block

}

به کدی که داخل بلوک try قرار می گیرد، کد محافظت شده گویند. دقت داشته باشید که بلوک های  catchباید بلافاصله بعد از بلوک try  قرار بگیرند. بعد از هر بلوک try هم باید بلوک های catch و یا بلوک finally بیاید. بلوک های catch برای درگیر شدن با exception ها به کار می روند. اصولا هر بلوک catch برای مدیریت یک Exception به کار می رود. وقتی که در داخل کدهای بلوک try خطایی رخ دهد بلوک  catch مربوط به آن، اجرا خواهد شد.
 
برای مثال ما یک آرایه با دو عنصر تعریف شده داریم و کد برنامه سعی میکند که به عنصر 3 دسترسی پیدا کند. ما آن را به صورت قطعه کد زیر مدیریت میکنیم:
 
// File Name : ExcepTest.java

import java.io.*;

public class ExcepTest {

   public static void main(String args[]) {

      try {

         int a[] = new int[2];

         System.out.println("Access element three :" + a[3]);

      } catch (ArrayIndexOutOfBoundsException e) {

         System.out.println("Exception thrown  :" + e);

      }

      System.out.println("Out of the block");

   }

   }
 
اکنون نتیجه اجرای کد به صورت زیر است:
 
Exception thrown  :java.lang.ArrayIndexOutOfBoundsException: 3

Out of the block

 
نکته: یک بلوک try میتواند چندین بلوک catch داشته باشد که نحوه نوشتاری آن به صورت زیر است:
 
try

{

   //Protected code

}catch(ExceptionType1 e1)

{

   //Catch block

}catch(ExceptionType2 e2)

{

   //Catch block

}catch(ExceptionType3 e3)

{

   //Catch block

}
 
از جاوا هفت به بعد برای استفاده از بلوک های catch چندگانه میتوان از قطعه کد ساده زیر استفاده کنید:
 
catch (IOException|FileNotFoundException ex) {
   logger.log(ex);
   throw ex;
}
توضیح کلمه های throws و throw:
در برخی مواقع اگر یک متد حاوی کدی باشد که باعث بروز یک استثنا شود، یا در همان متد باید آن استثنا را مدیریت کنیم و یا باید با کلمه throws استثناهایی را که ممکن است در آن رخ دهد را مشخص کنیم. اما کاربرد کلمه کلیدی throw به طور کامل با     تفاوت  throwsدارد. به عبارت دیگر کلمه کلیدی throws  برای این است که نوشتن try, catch را به عقب بیندازیم ولی کلمه throw  برای ساختن یک exception به طور دستی است.
بلاک :finally
این بلاک در ساختار try/catch بعد از تمام بلوک های catch قرار میگرد و استفاده از آن اختیاری است. این دستور زمانی که هیچکدام از دستورات داخل catch اجرا نشود، اجرا خواهد شد.
 
نحوه نوشتن آن به صورت زیر است:
 
try {
   // Protected code
} catch (ExceptionType1 e1) {
   // Catch block
} catch (ExceptionType2 e2) {
   // Catch block
} catch (ExceptionType3 e3) {
   // Catch block
}finally {
   // The finally block always executes.
}

نکات زیر را به خاطر بسپارید:
  • یک عبارت catch نمی تواند بدون دستورات وجود داشته باشد.
  • هرگاه یک بلوک try/catch وجود داشته باشد، finally در آن اجباری نیست.

ساختن exception  در جاوا:

برای ساخت یک کلاس اکسپشن باید به موارد زیر توجه کنید:
  • همه ی Exception ها باید فرزند Throwable باشند و از آن ارث برده باشند.
  • اگر می خواهید exception کامپایل بسازید که  کاربر را مجبور به مدیریت exception کند باید کلاسی که می سازید فرزند کلاس Exception  باشد.
  • اگر می خواهید که exception شما exception زمان اجرا باشد، باید کلاس شما فرزند RuntimeException باشد.
نحوه تعریف کلاس به شکل زیر است:
class MyException extends Exception{
}
برای تعریف کلاس فقط لازم است که از کلاس از قبل تعریف شده Exception در کلاس خود ارث برده باشید.
کلام آخر:
شما عزیزان میتوانید برای درک بهتر مطلب از دوره ی آموزش جاوا در سایت ما که به صورت رایگان و با کیفیت تهیه شده است، استفاده کنید.

کلمات کلیدی :
جاوا