دوره های آموزشی آکادمی پی وی لرن (پروژه محور و ویژه بازار کار)



  • ۱۴
  • مهر

جلسه ۱۸ : exception در جاوا

  • دسته‌بندی‌ها :
جلسه ۱۸ : exception در جاوا
    • جزئیات
    • نوع محتواآموزش تصویری

      مقدمه

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

      کار با exception در جاوا

      در ادامه ی مباحث کار با exception در جاوا ابتدا شما را با دلایل رخ دادن exception آشنا کرده و سپس به چگونگی مدیریت آن می پردازیم.

      exception ممکن است به دلایل مختلف رخ دهد. در زیر به برخی از دلایلی که ممکن است در آنها یک exception رخ دهد اشاره شده است:

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

      برخی از این exception ها به دلیل خطای کاربر، و برخی توسط خطای برنامه نویس و همچنین توسط منابع فیزیکی ایجاد می شود.

      بر اساس این، ما سه نوع exception داریم. شما باید آنها را درک کنید تا چگونگی کار با exception در جاوا را بدانید:

      ۱- exception های چک شده

      یک exception چک شده در زمان کامپایل برنامه ها رخ می دهد، و برنامه نویس می تواند با کدنویسی این exception ها را کنترل کند.

      برای مثال، فرض می کنیم از کلاس FileReader در برنامه خود برای خواندن داده ها از یک فایل استفاده می کنید.

      حالا اگر فایل مشخص شده در ساختار آن وجود نداشته باشد FileNotFoundException رخ می دهد.

      مثال:

      مثال : 

      اگر برنامه ی فوق را اجرا کنید با خطا یا exception زیر مواجه خواهید شد:

      مثال : 

      متد () read و () close از کلاس FileReader IOException ارائه می شوند.

      پس کامپایلر از FileNotFoundException برای مدیریت IOException بهره می گیرد.

      ۲- Exception های چک نشده

      exception چک نشده که در زمان اجرای اجرا رخ می دهد به عنوان Exceptions Runtime نیز شناخته می شود.

      این exception شامل اشکالات برنامه نویسی مانند اشتباهات منطقی یا استفاده نامناسب از API است.

      این نوع Exceptions در زمان کامپایل نادیده گرفته می شود.

      به عنوان مثال، فرض کنید آرایه ای از با اندازه ۵ عنصر را در برنامه خود اعلام کرده باشید.

      سپس سعی می کنیم عنصر شماره ۶ را فراخوانی کنیم.

      در این صورت یک خطای ArrayIndexOutOfBoundsExceptionexception رخ می دهد.

      مثال:

      مثال : 

      اگر کد فوق را کامپایل کرده و اجرا کنید با خطای زیر رو به رو خواهید شد:

      مثال : 

      ۳- Errors (خطاها)

      تمام موارد حتما یک exception نیست. گاهی مشکلی فراتر از کنترل کاربر یا برنامه نویس رخ می دهد.

      Error(خطا) معمولا در کد نادیده گرفته می شود چراکه شما نمی توانید تمام خطاها را در برنامه مدیریت کنید.

      سلسله مراتب exception

      همه کلاسهای exception زیرمجموعه کلاس java.lang.Exception هستند. کلاس exception خود یک کلاس از زیر کلاس Throwable است.

      به غیر از exception، زیرمجموعه دیگری به نام Error وجود دارد که از کلاس Throwable استخراج شده است.

      Error ها شرایط غیرطبیعی هستند که در صورت شکستهای شدید اتفاق می افتد.

      Error ها برای نشان دادن نوع خطای ایجاد شده از runtime environment استفاده می کند.

      کلاس Exception دارای دو زیر شاخه اصلی کلاس IOException و کلاس RuntimeException است.

      کار با exception در جاوا

      کار با exception در جاوا

      متدهای exception

      در زیر لیستی از متدهای مهم در کلاس Throwable موجود است:

      ردیفمتد و توضیحات
      ۱public String getMessage()

      این یک پیام در مورد exception رخ داده شده نشان می دهد،این پیام در سازنده Throwable آغاز شده است.

      ۲public Throwable getCause()

      علت exception را به عنوان یک شی Object Throwable نشان می دهد.

      ۳public String toString()

      نام کلاس متصل به نتیجه ()getMessage را می دهد.

      ۴public void printStackTrace()

      از متد () toString برای چاپ خطا استفاده می کند.

      ۵public StackTraceElement [] getStackTrace()

      یک آرایه را که حاوی هر عنصر در پشته است، را بازمی گرداند.

      ۶public Throwable fillInStackTrace()

      ردیابی پشته از شی Throwable را با ردیابی پشته فعلی پر می کند.

       

      گرفتن exception

      یک بلوک try / catch در اطراف کدی قرار می گیرد که ممکن است یک exception را تولید کند.

      کد در یک بلوک try / catch به عنوان کد حفاظت اشاره شده است و نحو استفاده از try / catch مانند زیر است

      عبارت catch برای اعلام نوع exception و پیغام خطا به کاربر است.

      مثال – در نمونه زیر یک آرایه با دو عنصر تعریف شده که کد برنامه سعی می کند به عنصر ۳ دسترسی پیدا کند.

      در نتیجه یک خطا رخ می دهد، که ما آن را مدیریت می کنیم:

      مثال : 

      نتیجه ی اجرای کد فوق بصورت زیر خواهد بود:

      مثال : 

      بلوک های catch چندگانه

      بلوک try را می توان با بلوک های catch چندگانه نیز توسعه داد.

      ساختار :

      مثال : 

      در کد فوق بلوک های چندگانه از catch ارائه شده که در هر بلوک Exception بررسی می شود.

      اگر Exception مربوط به هر بلوک catch نباشد به بلوک catch بعدی منتقل شده و بررسی می شود.

      مثال – کد زیر چگونگی استفاده از ساختار  try/catch چندگانه را بخوبی نشان می دهد:

      مثال : 

      مدیریت انواع مختلف Exception ها

      از جاوا ۷ به بعد ایجاد بلوک های catch چندگانه بصورت زیر ساده می شود:

      مثال : 

      کلمات کلیدی Throws/Throw

      کلمه ی کلیدی throws برای بررسی یک Exception در یک متد استفاده می شود.

      شما باید با استفاده از کلمه ی کلیدی throw یک Exception جدید را به اثبات برسانید.

      اختلاف بین throws و throw در این است که:

      throws برای متوقف کردن دستکاری یک Exception مورد استفاده قرار می گیرند.

      throw برای اعلام خطا استفاده می شود.

      مثال – متد زیر RemoteException را اجرا می کند :

      مثال : 

      در یک متد می توانید تعیین کنید که بیش از یک exception مورد بررسی قرار بگیرد، در این صورت exception ها در لیستی جداگانه با کاما از هم جدا شده و اعلام می شود.

      مثال:

      مثال : 

      بلوک finally  (پایانی)

      بلوک finally در ساختار try/catch بعد از تمام بلوک های catch قرار گرفته و در صورتی که هیچکدام از بلوک های catch اجرا نشود این بلوک اجرا خواهد شد.

      ساختار بلوک finally در ساختار  try/catch:

      مثال : 

      مثال:

      مثال : 

      نتیجه ی اجرای کد فوق بصورت زیر خواهد بود:

      مثال : 

      نکات زیر را به خاطر بسپارید:

      • یک عبارت catch نمی تواند بدون دستورات وجود داشته باشد.
      • هرگاه یک بلوک try/catch وجود داشته باشد، finally در آن اجباری نیست.
      • یک بلوک نمی تواند بدون هیچ Exception یا بند آخر نباشد.
      • هر کدی در بین بلوک های try, catch, finally می توان باشد.

      ساختار try با منبع

      به طور کلی، هنگام استفاده از منابع مانند stream ، اتصالات و…، ما باید با استفاده از بلوک finally به صراحت آن را ببندیم.

      مثال- در برنامه زیر، ما با استفاده از FileReader داده ها را از یک فایل می خوانیم و آن را با استفاده از نهایت بلوک finally می بندیم:

      مثال : 

      شما می توانید با استفاده از ساختار try-with-resources فایل هایی را در ساختار try/catch خوانده و آن ها را خطایابی کنید.

      برای اینکار کافیست که شما دستورات مورد نظر را در داخل پرانتز ” () ” قرار دهید.

      ساختار:

      مثال : 

      در زیر یک برنامه ی نمونه است که داده ها را در یک فایل با استفاده از ساختار try-with-resources می خواند:

      مثال : 

      نکات زیر باید در هنگام کار با ساختار try-with-resources در نظر گرفته بگیرید:

      • برای استفاده از یک کلاس با ساختار try-with-resources باید اینترفیس AutoCloseable را اجرا کرده و متد () close آن را به طور خودکار فراخوانی می کند.
      • شما می توانید در ساختار try-with-resources بیش از یک کلاس را اعلام کنید.
      • در حالی که کلاس های متعددی را در بلوک try با سند try-with-resources اعلام می کنید، این کلاس ها به ترتیب معکوس بسته می شوند.
      • به غیر از اعلام منابع در داخل پرانتزها، همه چیز همانند بلوک try/catch معمولی است.
      • منبع اعلام شده سعی می شود قبل از آغاز بلوک try، نمونه اکتیو شود.
      • منابع اعلام شده در بلوک try به صورت ضمنی به عنوان نهایی اعلام شده است.

      Exceptions تعریف شده توسط کاربر

      شما می توانید Exception های خود را در جاوا ایجاد کنید. در هنگام نوشتن کلاس های Exception خود نکات زیر را در ذهن داشته باشید:

      • همه Exception ها باید یک فرزند Throwable باشد.
      • اگر می خواهید یک Exception چک شده را که به طور خودکار با استفاده از Handle یا Declare Rule اجرا می شود، بنویسید، باید کلاس Exception را گسترش دهید.
      • اگر می خواهید Exception زمان اجرا را بنویسید، باید کلاس RuntimeException را گسترش دهید.

      ما می توانیم کلاس Exception خودمان را به صورت زیر تعریف کنیم:

      مثال : 

      شما فقط باید کلاس Exception را از قبل تعریف کنید تا Exception خودتان را ایجاد کنید.

      اینها به عنوان Exception مورد بررسی قرار می گیرند.

      کلاس ExecuteFundsException زیر یک استثناء تعریف شده توسط کاربر است که کلاس Exception را گسترش می دهد و آن را یک Exception بررسی می کند.

      مثال:

      مثال : 

      کلاس زیر CheckingAccount شامل یک متد ()withdraw است که InsufficientFundsException را با throws اجرا می کند:

      مثال : 

      در برنامه BankDemo زیر، متدهای ()deposit و () withdraw  توسط CheckingAccount فراخوانی می شود:

      مثال : 

      کد برنامه ی BankDemo را کامپایل و اجرا کنید تا نتیجه ی زیر را مشاهده کنید:

      مثال : 

      Exception مشترک

      در جاوا، می توان دو دسته اشکالات و خطاها را تعریف کرد:

      • JVM Exceptions : شامل خطاهایی انحصاری یا منطقی می باشد که توسط JVM ارائه می شود.

      مثال : NullPointerException، ArrayIndexOutOfBoundsException، ClassCastException

      • Programmatic Exceptions :

      مثال : IllegalArgumentException, IllegalStateException

      کلام آخر

      مدیریت خطاها همیشه یکی از شاخص های یک زبان برنامه نویسی برتر می باشد. جاوا به عنوان محبوب ترین زبان برنامه نویسی دنیا، ساز کار مناسبی را برای مدیریت خطاها ارائه می دهد که ما در بررسی مباحث چگونگی کار با exception در جاوا آن ها را ارائه کردیم.

      QR:  جلسه ۱۸ : exception در جاوا
      به اشتراک بگذارید