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

چه نوع استثنایی در جاوا وجود دارد. انواع استثنا در جاوا

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

کلمات کلیدی استثنایی تلاش، گرفتن، پرتاب، پرتاب، در نهایت

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

  • گرفتن،
  • پرت كردن،
  • پرتاب می کند،
  • سرانجام.

در زیر شکل کلی بلوک مدیریت استثنا آمده است.

( // بلوک کد ) را امتحان کنید ( f) ( // کنترل کننده استثنا از نوع ExceptionType1 ) catch ( f) ( // کنترل کننده استثنا از نوع ExceptionType2 ) در نهایت ( // ... )

انواع استثنا

در بالای سلسله مراتب استثنا، کلاس قرار دارد قابل پرتاب، که از آن به ارث رسیده است هدف - شی. هر یک از انواع استثنا یک زیر کلاس از Throwable است. دو فرزند مستقیم کلاس Throwable سلسله مراتب زیر کلاس استثنا را به دو شاخه مجزا تقسیم می کنند. سلسله مراتب کلاس در شکل نشان داده شده است.

کلاس استثنابرای توصیف استثناهایی که باید توسط کد کاربر شناسایی شوند استفاده می شود. کلاس خطابرای توصیف موقعیت‌های استثنایی در نظر گرفته شده است که در شرایط عادی نباید در برنامه کاربر قرار بگیرند.

استثنائات ناشناخته

اشیاء استثنا به طور خودکار توسط زمان اجرا جاوا در نتیجه برخی استثناها ایجاد می شوند. نمونه ای از برنامه ای که در آن هنگام تقسیم بر صفر استثنا ایجاد می کنیم.

نمونه بسته بندی؛ کلاس TestException (اصطلاح خالی استاتیک عمومی (Args رشته) (int d = 0؛ int a = 42 / d؛ System.out.println ("a = " + a)؛ ))

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

استثنا در رشته "main" java.lang.ArithmeticException: / با صفر در samples.TestException.main(TestException.java:8)

توجه داشته باشید که نوع استثنا پرتاب شده نبود استثناو نه قابل پرتاب. این یک زیر کلاس از کلاس است استثنا، برای مثال: استثنا حسابی A که توضیح می دهد چه خطایی در هنگام اجرای برنامه رخ داده است.

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

نمونه بسته بندی؛ کلاس عمومی TestException ( subroutine void static () int d = 0; int a = 10 / d; System.out. println ("a = " + a); ) public void main(string args) (TestException. subroutine( )))

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

استثنا در رشته "main" java.lang.ArithmeticException: / با صفر در نمونه ها.TestException.subroutine(TestException.java:8) در samples.TestException.main(TestException.java:14)

گرفتن استثناهای امتحان/گرفتن

برای محافظت از کد برنامه در برابر استثناها، باید از بلوک های مرتبط با کلمات کلیدی استفاده کنید سعی کن بگیر; catch بلافاصله بعد از بلوک try قرار می گیرد. بلوک catch نوع استثنایی را که باید مدیریت شود را مشخص می کند.

کلاس TestException ( اصلی خالی استاتیک عمومی (Args رشته) ( سعی کنید (int d = 0; int a = 42 / d; ) catch (ArithmeticException e) ( System.out.println ("تقسیم بر صفر")؛ ) )

هدف از به خوبی طراحی شده است گرفتن-بخش‌ها باید استثنای ایجاد شده را پردازش کنند و متغیرهای برنامه را به حالت معقولی برسانند - به طوری که برنامه را بتوان به گونه‌ای ادامه داد که گویی هیچ خطایی وجود ندارد (در مثال ما یک هشدار نمایش داده می‌شود - تقسیم بر صفر).

چند بخش گرفتن

در برخی موارد، یک بلوک کد ممکن است استثناهایی از انواع مختلف ایجاد کند. به منظور محلی سازی رسیدگی به چنین موقعیت هایی، می توانید از چندین مورد استفاده کنید گرفتن-بخش برای یک بلوک را امتحان کنید. بلوک‌های تخصصی‌ترین کلاس‌های استثنا باید اول باشند، زیرا اگر بعد از سوپرکلاس قرار گیرند، به هیچ زیرکلاسی دسترسی پیدا نمی‌کند.

مثال زیر دو نوع استثنای متفاوت را به همراه دارد، با دو دسته‌گر تخصصی که بخش را دنبال می‌کنند گرفتنهدف کلی، رهگیری تمام زیر کلاس های یک کلاس قابل پرتاب.

کلاس MultiCatch ( int static c = ( 1 )؛ public void main (string args) ( try ( int a = args.length; System.out.println ("a = " + String.valueOf(a))؛ int b = 23 / a; c = 33; ) catch (ArithmeticException e) ( System.out.println("ArithmeticException: " + e.getMessage())؛ ) catch(ArrayIndexOutOfBoundsException e) ( System.out.println("ArrayIndexExOut " + e.getMessage()); ) ))

این مثال، بدون پارامتر اجرا می‌شود، یک استثنا تقسیم بر صفر ایجاد می‌کند. اگر یک یا چند پارامتر در خط فرمان مشخص شود، بنابراین "a" را روی مقداری بزرگتر از صفر قرار دهیم، آنگاه یک استثنای خارج از محدوده ایجاد می شود. ArrayIndexOutOfBounds. در زیر نتایج اجرای این برنامه به هر دو صورت است.

A = 0 div در 0: java.lang.ArithmeticException: / با صفر a = 1 آرایه شاخص oob: java.lang.ArrayIndexOutOfBoundsException:33

عبارات امتحان تو در تو

اپراتورها تلاش كردنمی توانید روی یکدیگر سرمایه گذاری کنید اگر اپراتور تلاش كردنسطح پایین بدون بخش گرفتنمطابق با استثنای پرتاب شده، پشته یک پله به سمت بالا گسترش می‌یابد، و بخش‌های catch دستور بیرونی try برای یک کنترل‌کننده مناسب بررسی می‌شوند. نمونه ای از تودرتو کردن دو عبارت سعی کن بگیربا فراخوانی یک متد به یکدیگر وارد شوند.

کلاس MultiNest ( static int c = ( 1 )؛ static void checkArray() ( try (c = 33; ) catch(ArrayIndexOutOfBoundsException e) ( System.out.println "ArrayIndexOutOfBoundsException: " + e.getMessage())); static void main(string args) ( try ( int a = args.length(); System.out.println ("a = " + a); int b = 23 / a; checkArray(); ) catch (ArithmeticException e) ( System.out.println ("ArithmeticException: " + e.getMessage()); ) )

استثناها را پرتاب کنید

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

مثالی از یک استثنا که در آن ابتدا شیء استثنا ایجاد می شود، سپس عبارت پرت كردنیک استثنا را ایجاد می کند، پس از آن، همان استثنا دوباره مطرح می شود - این بار توسط کد بخشی که اولین بار آن را دریافت کرد گرفتن.

کلاس TestThrow ( متد static void() ( امتحان کنید ( پرتاب جدید NullPointerException ("Exception در متد")؛ ) catch (NullPointerException e) ( System.out.println(e.getMessage()؛ پرتاب e;) ) خالی استاتیک عمومی main(string args) ( try ( method(); ) catch(NullPointerException e) ( System.out.println("Catch inside main: " + e.getMessage()); ) ) )

نتیجه اجرای برنامه در زیر نشان داده شده است.

استثنا در روش Catch inside main: استثنا در روش

اعلان استثنا را پرتاب می کند

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

اگر روش صریح باشد (یعنی استفاده از عملگر پرت كردن) یک استثنا می اندازد، نوع کلاس استثنا باید در عبارت مشخص شود پرتاب می کنددر اعلام این روش. با در نظر گرفتن این موضوع، نحو تعریف یک روش باید به صورت زیر توصیف شود:

کلاس عمومی TestThrow ( روش void استاتیک () IllegalAccessException را پرتاب می کند ( سعی کنید ( System.out.println ("روش درونی")؛ پرتاب جدید IllegalAccessException ("Exception در روش")؛ ) catch (NullPointerException e) ( System.out.println( e.getMessage());) ) public static void main(string args) ( try ( method(); ) catch(IllegalAccessException e) ( System.out.println("Catch inside main: " + e.getMessage()) ;)))

نتیجه مثال:

Catch inside main: استثنا در روش

در نهایت کلمه کلیدی

در مواردی که لازم است اجرای بخش خاصی از کد را تضمین کنید، باید از کلمه کلیدی استفاده کنید سرانجام. استفاده از ارتباط تلاش کن...بالاخرهبه شما این امکان را می دهد که بدون در نظر گرفتن اینکه کدام استثنا پرتاب شده و گرفته شده است، کد اجرا می شود، حتی در مواردی که متد یک بخش catch مربوط به استثنای پرتاب شده ندارد.

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

در زیر مثالی از یک کلاس با دو متد است که به دلایل مختلف خاتمه می یابد، اما هر دو کد بخش را قبل از خروج اجرا می کنند. سرانجام.

کلاس عمومی TestFinally ( استاتیک void methodA() ( سعی کنید ( System.out.println ("inside methodA")؛ RuntimeException جدید را پرتاب کنید ("Exception in methodA")؛ ) در نهایت ( System.out.println ("در نهایت درون متدA") ; ) ) static void methodB() ( try ( System.out.println ("inside methodB"); return; ) در نهایت ( System.out.println("در نهایت در داخل متدB"); ) ) public static void main(string args ) ( try ( methodA(); ) catch (Exception e) ( System.out.println("Catch استثنا در داخل اصلی"); ) methodB(); ) )

در مورد تست، یک استثنا در روش A ایجاد می شود. اما قبل از خروج زودهنگام از بلوک تلاش كردن، بخش اجرا می شود سرانجام. روش دوم متدB کار را در آن کامل می کند تلاش كردناپراتور بلوک برگشت، اما در همان زمان قبل از خروج از متد، کد برنامه بلوک اجرا می شود سرانجام. نتیجه آزمایش:

روش درونیA در نهایت درون متدA گرفتن استثنا در درون اصلی درون متدB در نهایت درون متدB

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

ارث استثنایی

گرفتن- ساخت چند شکلی، یعنی. catch on type والد استثناهایی از هر نوع که Parent است را می گیرد.

کلاس عمومی TestException ( public static void main (String args) ( try ( System.err.print ("سطح 0")؛ پرتاب جدید RuntimeException(); System.err.print ("سطح 1"); ) catch (Exception e ) ( // catch Exception CATCH RuntimeException System.err.print("سطح 2")؛ ) System.err.println("سطح 3"); ) )

در نتیجه در کنسول خواهیم دید

سطح 0 سطح 2 سطح 3

خطا و استثنااز شاخه های موازی ارث از قابل پرتاببنابراین گرفتن یک "برادر" نمی تواند "برادر" دیگر را بگیرد.

کلاس عمومی TestError ( public static void main (string args) ( try ( System.err.println ("سطح 0")؛ if (true) (Trow new Error(); ) System.err.println ("سطح 1 ") ؛ ) catch (Exception e) ( System.err.println("سطح 2")؛ ) System.err.println("سطح 3"); ) )

نتیجه اجرای برنامه

سطح 0 استثنا در موضوع "main" java.lang.Error در TestError.main(TestFinally.java:8)

استثناهای متعدد

اعلان استثناها در یک متد می تواند چندگانه باشد. مثال:

وارد کردن java.io.EOFException. وارد کردن java.io.FileNotFoundException. کلاس عمومی MultiException ( // اعلان استثناها public static void main(string args) EOFException، FileNotFoundException را پرتاب می کند (اگر (System. currentTimeMillis() % 2 == 0) ( پرتاب جدید EOFException(); ) else (پرتاب جدید FileNotFoundException(); ))))

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

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

سلسله مراتب

قبل از اینکه به تمرین بپردازیم، بیایید با انواع استثناهای جاوا و سلسله مراتب آنها آشنا شویم. در قلب همه چیز کلاس Throwable قرار دارد. تمام کدهای ممکن در تضاد با دستگاه و کاربر در اینجا توضیح داده شده است. برای سهولت در پردازش و خواندن، کلاس Throwable دارای زیر کلاس های Error و Exception است. خطا - خطاهای مهمی که لزوماً به دلیل تقصیر کاربر رخ نمی دهند، قابل پردازش نیستند. استثنا - تضادهای واقعی برنامه ما که باید گرفتار شوند.

به نمودار سلسله مراتبی استثنایی جاوا ساده نگاهی بیندازید:

همانطور که می بینید، بلوک ها بر اساس رنگ به "دو اردو" تقسیم می شوند - استثناهای جاوا علامت گذاری شده و بدون علامت. این طبقه‌بندی نشان می‌دهد که کامپایلر چگونه آنها را درک می‌کند: بررسی شده - در نظر گرفته شده، بررسی نشده است - نادیده می‌گیرد. اولین مورد شامل Exception به طور کامل، به جز RuntimeException است. تمام کلاس های استثنای دیگر توسط کامپایلر برداشته می شوند.

سلسله مراتب کلاس استثنا نیز برای سازماندهی مناسب کد مهم است. فرض کنید چندین واحد پردازش دارید. سپس در ابتدا لازم است سطوح پایین تر و در انتها - بالاترین نشان داده شود. در غیر این صورت، فقط بلوک اول اجرا می شود و بقیه نادیده گرفته می شوند.

ایجاد یک کنترل کننده

عبارات زیر برای رسیدگی به استثناهای جاوا استفاده می شود: try, catch, last, throw, throws. سه مورد اول ساختار استاندارد بلوک شما هستند. گام به گام:

  1. عبارت یا قطعه کدی که در آن باید خطا را پیدا کنید در یک بلوک try قرار می گیرد.
  2. بعد، در بلوک catch، مشخص می‌کنید که چه نوع استثنایی باید گرفته شود و چگونه آن را مدیریت کنید.
  3. در بلوک نهایی، مجموعه ای از اقدامات مورد نیاز هنگام بروز خطا. معمولاً این نوشتن داده، بستن منابع و غیره است. بدون در نظر گرفتن محرک catch، بلوک همیشه اجرا می شود.

ساختار مثال استثنای جاوا را در نظر بگیرید:

تلاش كردن(

}
گرفتن (به جز_نوع استثنا_شیء) (
// کد پردازش
}
سرانجام(

}

اگر می خواهید چندین استثنا را مدیریت کنید، فقط یک بلوک catch دیگر ایجاد کنید.

تلاش كردن(
// کدی که می خواهیم خطا را ردیابی کنیم
}
catch (exception_type_1exception_object1) (
// کد پردازش
}
catch (except_type_2 exclusive_object2) (
// کد پردازش
}
سرانجام(
// بعد از پایان بلوک try چه باید کرد
}

با دستور throw، می توانید استثناها را ایجاد کنید:

پرتاب نمونه_قابل پرتاب

در عمل به این صورت است:

دانش آموز stud1;

if(stud1 == null)(

}
}

بیایید در مثال استاندارد try-catch خود یک عبارت drop اضافه کنیم:

public void onClick (نمایش مشاهده) (
اگر (stud1 == null) (
تلاش كردن(
پرتاب جدید NullPointerException ("دانشجو وجود ندارد");
) catch (NullPointerException e) (
Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
}
}
}

به محض اینکه پردازش به دستور throw برسد، اجرای کد بیشتر خاتمه خواهد یافت. کنترل کننده نزدیکترین بلوک try-catch را برای استثنای مورد نیاز، سپس مورد بعدی را در نظر می گیرد و تا پایان کد به همین ترتیب ادامه می دهد. اگر راهی برای ایجاد استثنا از هر جایی وجود نداشته باشد، کنترل کننده برنامه را متوقف می کند.

دستور throws برای متدهایی استفاده می شود که دارای استثنا هستند اما مدیریت نمی شوند.

نوع method_name(param_list) استثنا_list را پرتاب می کند (
// کد روش
}

چندین استثنا در لیست باید با کاما از هم جدا شوند. با استفاده از این ساختار، به همه متدهای فراخوانی می‌گویید که استثناها را مدیریت کنند.

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

استثناهای آماده و جدید

  • ArithmeticException - خطاهای محاسباتی.
  • NullPointerException - اشاره به فضای خالی.
  • NegativeArraySizeException - آرایه ای از ابعاد منفی.
  • ArrayStoreException - نوع اشتباهی که به عنصر آرایه اختصاص داده شده است.
  • NumberFormatException - نمی توان رشته را به عدد تبدیل کرد.
  • IllegalArgumentException - آرگومان نامعتبر در فراخوانی متد.
  • UnsupportedOperationException - عملیات مشخص شده وجود ندارد.
  • TypeNotPresentException - نوع مشخص شده وجود ندارد.

تمام انواع مشخص شده استثناهای جاوا در کلاس RuntimeException قرار دارند، به این معنی که نیازی به مشخص شدن آنها در بلوک throws نیست.

به طور طبیعی، سیستم نمی تواند شامل انواع استثناها باشد. برخی از آنها باید به تنهایی ایجاد شوند. برای ایجاد استثنای جاوای خود، باید کلاس خود را از Exception به ارث برده و متدهای مورد نیاز کلاس Throwable را لغو کنید. یا از نزدیکترین نوع در معنا به ارث برده شود. مثالی از برنامه ای را برای اندروید در نظر بگیرید که یک استثنای جاوا ایجاد می کند:

بسته geekbrains.exception;

وارد کردن android.os.Bundle.
وارد کردن android.support.v7.app.AppCompatActivity.
وارد کردن android.view.View;

MainActivity کلاس عمومی AppCompatActivity را گسترش می دهد(

@Override
محافظت از void onCreate(Bundle savedInstanceState) (
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}

public void testMethod() StudentException(
System.out.println("Throwing StudentException from testMethod()");
پرتاب جدید StudentException(); // سازنده پیش فرض
}

Public void testMethod2() StudentException را پرتاب می کند
System.out.println("Throwing StudentException from testMethod2()");
throw new StudentException("ایجاد شده در روش دوم");
}

عمومی void onClick (نمایش) (
تلاش كردن(
روش آزمون()؛

e.printStackTrace();
System.out.println("Exception Catch");
}

تلاش كردن(
testMethod2();
) catch (StudentException e) (
e.printStackTrace();
}
}

کلاس StudentException Exception را گسترش می دهد(
StudentException() (
}

StudentException(پیام رشته ای) (
super(msg);
}
}
}

رسیدگی به استثناها اساس کد ایمن و با کیفیت است. با کمک آنها می توانید اقدامات کاربر، جریان برنامه را کنترل کنید یا به کدها واریانس اضافه کنید.

آخرین به روز رسانی: 1394/10/30

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

زبان جاوا امکانات ویژه ای را برای رسیدگی به چنین موقعیت هایی فراهم می کند. یکی از این امکانات، تلاش ... گرفتن ... در نهایت ساخت است. هنگامی که یک استثنا در بلوک try رخ می دهد، کنترل به بلوک catch منتقل می شود، که می تواند استثنای داده شده را مدیریت کند. اگر چنین بلوکی یافت نشد، یک پیام استثنای کنترل نشده به کاربر نمایش داده می شود و اجرای بیشتر برنامه متوقف می شود. و برای اینکه چنین توقفی اتفاق نیفتد، باید از بلوک try..catch استفاده کنید. مثلا:

اعداد int = int جدید; اعداد=45; System.out.println (اعداد);

از آنجایی که آرایه اعداد ما فقط می تواند شامل 3 عنصر باشد، هنگامی که دستور numbers=45 اجرا می شود، کنسول یک استثنا را نمایش می دهد و برنامه خاتمه می یابد. حالا بیایید سعی کنیم این استثنا را مدیریت کنیم:

Try( int numbers = new int; numbers=45; System.out.println(numbers); ) catch(Exception ex)( ex.printStackTrace(); ) System.out.println("برنامه تمام شد");

هنگام استفاده از بلوک try...catch، ابتدا تمام دستورات بین دستورات try و catch اجرا می شوند. اگر یک استثنا در بلوک try رخ دهد، دستور اجرای عادی متوقف می شود و به دستور catch ادامه می یابد. بنابراین، زمانی که اجرای برنامه به عدد خط=45 رسید; ، برنامه متوقف می شود و به بلوک catch می رود

عبارت catch دارای نحو زیر است: catch (exception_type variable_name) . در این حالت متغیر ex اعلان می شود که از نوع Exception است. اما اگر استثنای پرتاب شده یک استثنا از نوع مشخص شده در دستور catch نباشد، مدیریت نمی شود و برنامه به سادگی هنگ می کند یا یک پیغام خطا می فرستد.

اما از آنجایی که نوع Exception کلاس پایه برای همه استثناها است، دستور catch(Exception ex) تقریباً تمام استثناها را مدیریت می کند. مدیریت استثنا در این مورد به چاپ stack trace خطا در کنسول با استفاده از متد printStackTrace() تعریف شده در کلاس Exception منجر می شود.

پس از تکمیل بلوک catch، برنامه به کار خود ادامه می دهد و تمام دستورالعمل های دیگر را بعد از بلوک catch اجرا می کند.

ساختار try..catch همچنین می تواند یک بلوک نهایی داشته باشد. با این حال، این بلوک اختیاری است و می تواند از مدیریت استثنا حذف شود. بلوک نهایی بدون در نظر گرفتن اینکه آیا یک استثنا در بلوک try انداخته شده است یا خیر اجرا می شود:

سعی کنید( اعداد int = int جدید؛ اعداد = 45؛ System.out.println (اعداد)؛ ) catch(Exception ex)( ex.printStackTrace(); ) در نهایت( System.out.println ("در نهایت مسدود")؛ ) System.out.println ("برنامه تمام شد");

رسیدگی به استثناهای متعدد

انواع مختلفی از استثناها در جاوا وجود دارد، و ما می‌توانیم مدیریت آنها را با اضافه کردن بلوک‌های catch اضافی مشخص کنیم:

اعداد int = int جدید; try( numbers=45; numbers=Integer.parseInt("gfd"); ) catch(ArrayIndexOutOfBoundsException ex)( System.out.println("آرایه خارج از محدوده"); ) catch(NumberFormatException ex)( System.out.println ("خطا در تبدیل رشته به عدد")؛

اگر از نوع خاصی استثنا داشته باشیم، به بلوک catch مربوطه می رود.

بیانیه پرتاب

شما می توانید از دستور throw برای گزارش اینکه یک استثنا در برنامه شما رخ داده است استفاده کنید. یعنی ما خودمان به کمک این عملگر می توانیم استثنا ایجاد کنیم و در هنگام اجرا آن را بالا ببریم. به عنوان مثال، در برنامه ما، یک عدد در حال وارد شدن است، و ما می خواهیم در صورتی که عدد بزرگتر از 30 باشد، یک استثنا ایجاد شود:

بسته firstapp; وارد کردن java.util.Scanner. کلاس عمومی FirstApp ( public static void main (string args) ( try( Scanner in = new Scanner (System.in); int x = in.nextInt(); if(x>=30) (exception new ("Number x") باید کمتر از 30" باشد؛ ) ) catch(Exception ex)( System.out.println(ex.getMessage())؛ ) System.out.println("برنامه خاتمه یافت"); ) )

در اینجا، برای ایجاد یک شیء استثنا، از سازنده کلاس Exception استفاده می شود که پیام استثنا به آن ارسال می شود. و اگر عدد x بزرگتر از 29 باشد، یک استثنا ایجاد می شود و کنترل به بلوک catch منتقل می شود.

در بلوک catch، می توانیم پیام استثنا را با استفاده از متد getMessage() دریافت کنیم.

هی هابر! ترجمه مقاله Fixing 7 Common Exception Handling Mistakes توسط Thorben Janssen را تقدیم شما می کنم.

رسیدگی به یک استثنا یکی از رایج ترین کارها است، اما لزوماً یکی از آسان ترین کارها نیست. این هنوز یکی از موضوعاتی است که اغلب در تیم‌های با تجربه مورد بحث قرار می‌گیرد، و چندین روش برتر و مشکلات رایج وجود دارد که باید از آنها آگاه باشید.

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

اشتباه 1: اعلام java.lang.Exception یا java.lang.Throwable

همانطور که قبلاً می دانید، باید یک استثنای علامت زده را اعلام کنید یا مدیریت کنید. اما استثناهای علامت زده تنها مواردی نیستند که می توانید مشخص کنید. شما می توانید از هر زیر کلاس java.lang.Throwable در عبارت throws استفاده کنید. بنابراین، به جای تعیین دو استثنا مختلف که قطعه کد زیر پرتاب می کند، می توانید به سادگی از java.lang.Exception در عبارت throws استفاده کنید.

public void doNotSpecifyException() Exception (doSomething) را می اندازد
اما این بدان معنا نیست که شما باید. مشخص کردن Exeption یا Throwable باعث می‌شود زمانی که روش شما فراخوانی می‌شود، کنترل صحیح آنها تقریبا غیرممکن است. تنها اطلاعاتی که تماس‌گیرنده شما دریافت می‌کند این است که ممکن است مشکلی پیش بیاید. اما شما هیچ اطلاعاتی در مورد رویدادهای استثنایی که ممکن است رخ دهد به اشتراک نمی گذارید. شما این اطلاعات را پشت دلایل کلی برای پرتاب استثناها پنهان می کنید. وقتی برنامه شما در طول زمان تغییر می کند بدتر می شود. پرتاب استثناهای عمومی همه تغییرات استثنایی را که تماس گیرنده باید انتظار داشته باشد و آنها را مدیریت کند، پنهان می کند. این می تواند منجر به چندین خطای غیرمنتظره شود که باید به جای خطای کامپایلر در مورد تست پیدا شوند.

از کلاس های بتنی استفاده کنید

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

void عمومی specifySpecificExceptions() NumberFormatException، IllegalArgumentException (doSomething();

اشتباه 2: گرفتن استثناهای عمومی

شدت این خطا بستگی به این دارد که کدام مؤلفه نرم افزاری را پیاده سازی می کنید و کجا استثنا را می گیرید. شاید خوب باشد که java.lang.Exception را در روش اصلی برنامه Java SE خود بگیرید. اما اگر در حال پیاده‌سازی یک کتابخانه یا کار بر روی لایه‌های عمیق‌تر برنامه خود هستید، ترجیح می‌دهید استثناهای خاصی را دریافت کنید.

این چندین مزیت را به همراه دارد. این رویکرد به هر کلاس استثنا اجازه می دهد تا به طور متفاوتی مدیریت شود و از گرفتن استثناهایی که انتظارش را نداشتید جلوگیری می کند.

اما توجه داشته باشید که اولین بلوک catch که کلاس استثنا یا یکی از سوپرکلاس های آن را کنترل می کند، آن را می گیرد. بنابراین حتماً ابتدا خاص ترین کلاس را بگیرید. در غیر این صورت، IDE های شما خطا یا هشداری در مورد بلوک کد غیرقابل دسترسی نشان می دهند.

( doSomething(); ) catch (NumberFormatException e) ( // handle the NumberFormatException log.error(e); ) catch (IllegalArgumentException e) ( // handle the IllegalArgumentException log.error(e); )

اشتباه 3: استثناهای ثبت و پرتاب

این یکی از رایج ترین خطاها در مدیریت استثناهای جاوا است. ممکن است منطقی به نظر برسد که استثنا را در جایی که پرتاب شده است ثبت کنید و سپس آن را به تماس گیرنده بازگردانید، که می تواند مدیریت خاص را برای مورد استفاده خاص اجرا کند. اما به سه دلیل نباید این کار را انجام دهید:

1. اطلاعات کافی در مورد use case که فراخوان متد شما می خواهد پیاده سازی کند ندارید. استثنا ممکن است بخشی از رفتار مورد انتظار باشد و توسط مشتری انجام شود. در این صورت نیازی به ثبت آن نیست. این یک پیغام خطای نادرست به فایل گزارش اضافه می کند که باید توسط تیم عملیاتی شما فیلتر شود.

2. پیام log هیچ اطلاعاتی را ارائه نمی دهد که قبلاً بخشی از خود استثنا نباشد. ردیابی و ردیابی پشته آن باید حاوی تمام اطلاعات لازم در مورد رویداد استثنایی باشد. پست آن را توصیف می کند، و stack trace جزئیاتی در مورد کلاس، متد و خطی دارد که روی آن اتفاق افتاده است.

3. وقتی یک استثنا را در هر بلوک catch که آن را می گیرد، می توانید چندین بار وارد کنید. این آمارها را در ابزار نظارت شما به هم می ریزد و خواندن فایل گزارش را برای تیم عملیات و توسعه شما سخت می کند.

استثنا را در جایی که آن را مدیریت می کنید ثبت کنید

بنابراین بهتر است زمانی که آن را مدیریت می کنید، استثنا را ثبت کنید. مانند قطعه کد زیر. روش doSomething یک استثنا ایجاد می کند. روش doMore فقط آن را مشخص می کند زیرا توسعه دهنده اطلاعات کافی برای مدیریت آن را ندارد. سپس در متد doEvenMore پردازش می شود که یک پیام گزارش نیز می نویسد.

public void doEvenMore() ( try ( doMore(); ) catch (NumberFormatException e) ( // handle the NumberFormatException ) catch (IllegalArgumentException e) ( // handle the IllegalArgumentException ) ) void عمومی doMore() IllegalArgumentException را می اندازد () ) ) عمومی void doSomething() NumberFormatException، IllegalArgumentException (// کاری انجام دهید)

اشتباه 4: استفاده از استثناها برای کنترل جریان

استفاده از استثناها برای کنترل جریان برنامه به دو دلیل اصلی یک ضد الگو در نظر گرفته می شود:

آنها اساساً مانند یک دستور Go To کار می کنند زیرا اجرای بلوک کد را لغو می کنند و به اولین بلوک catch که استثنا را کنترل می کند می پرند. این کار خواندن کد را بسیار دشوار می کند.

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

اشتباه 5: علت استثنا را حذف کنید

گاهی اوقات ممکن است لازم باشد یک استثنا را در دیگری بپیچید. ممکن است تیم شما تصمیم گرفته باشد از یک استثنای خاص کسب و کار با کدهای خطا و مدیریت یکنواخت استفاده کند. تا زمانی که علت را از بین نبرید، این رویکرد اشکالی ندارد.

هنگامی که یک استثنا جدید می اندازید، همیشه باید استثنای اصلی را به عنوان دلیل تعیین کنید. در غیر این صورت، پیام و ردپایی را که رویداد استثنایی را که باعث استثنای شما شده است، توصیف می‌کند، از دست خواهید داد. کلاس Exception و همه زیر کلاس‌های آن چندین متد سازنده را ارائه می‌کنند که استثنای اصلی را به عنوان پارامتر در نظر می‌گیرند و آن را به عنوان علت ارائه می‌کنند.

اشتباه 6: تعمیم استثنا

وقتی یک استثنا را تعمیم می‌دهید، یک مورد خاص مانند NumberFormatException را می‌گیرید و به جای آن یک java.lang.Exception غیر اختصاصی می‌اندازید. این مشابه، اما حتی بدتر از اولین خطایی است که در این مقاله توضیح دادم. نه تنها اطلاعات مربوط به یک مورد خطای خاص را در API شما پنهان می کند، بلکه دسترسی به آن را سخت تر می کند.

void عمومی doNotGeneralizeException() Exception را پرتاب می کند ( try ( doSomething(); ) catch (NumberFormatException e) ( پرتاب جدید Exception(e)؛ ) catch (IllegalArgumentException e) ( پرتاب جدید Exception(e); ) )
همانطور که در قطعه کد زیر می بینید، حتی اگر بدانید که یک روش ممکن است چه استثناهایی ایجاد کند، نمی توانید آنها را به سادگی دریافت کنید. باید کلاس Exception عمومی را بگیرید و سپس نوع علت آن را بررسی کنید. اجرای این کد نه تنها دشوار است، بلکه خواندن آن نیز دشوار است. اگر این روش را با خطای 5 ترکیب کنید حتی بدتر می شود. این کار تمام اطلاعات مربوط به رویداد استثنایی را حذف می کند.

(doNotGeneralizeException) را امتحان کنید (Exception e) ( if (e.getCause() instanceof NumberFormatException) (log.error("NumberFormatException:" + e)؛ ) در غیر این صورت اگر (e.getCause() نمونه از IllegalArgumentException) .error("IllegalArgumentException:" + e)؛ ) else (log.error("استثنای غیرمنتظره: " + e); )
پس بهترین رویکرد چیست؟

مشخص باشید و دلیل استثنا را ذخیره کنید.

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

( doSomething(); ) catch (NumberFormatException e) (پرتاب جدید MyBusinessException(e, ErrorCode.CONFIGURATION_ERROR)؛ ) catch (IllegalArgumentException e) (پرتاب جدید MyBusinessException(e, ErrorCode.UNEXPECTED);

اشتباه 7: اضافه کردن تغییرات استثنایی غیر ضروری

همانطور که قبلاً توضیح دادم، اگر استثناء اصلی را به عنوان علت تنظیم کنید، می‌تواند مفید باشد که استثناها را در موارد سفارشی قرار دهید. اما برخی از معماران زیاده روی می کنند و برای هر سطح معماری یک کلاس استثنایی خاص معرفی می کنند. بنابراین آنها استثنا را در لایه persistence می گیرند و آن را در MyPersistenceException می پیچند. لایه کسب و کار آن را می گیرد و در MyBusinessException می پیچد و این کار تا زمانی که به لایه API برسد یا مدیریت شود ادامه می یابد.

public void persistCustomer(Customer c) myPersistenceException ( // persist a Customer ) public void managementCustomer(Customer c) MyBusinessException را پرتاب می کند ( // مدیریت تلاش مشتری ( persistCustomer(c)؛ ) catch (MyPersistenceExceptione , e.getCode())؛ ) ) public void createCustomer(Customer c) MyApiException را پرتاب می کند ( // ایجاد یک امتحان مشتری (managementCustomer(c)؛ ) catch (MyBusinessException e) (پرتاب جدید MyApiException(e, e.getCode() )))
به راحتی می توان فهمید که این کلاس های استثنای اضافی هیچ مزیتی ندارند. آنها فقط لایه های اضافی را معرفی می کنند که استثنا را می پوشانند. و در حالی که پیچیده کردن یک هدیه در تعداد زیادی کاغذ رنگارنگ سرگرم کننده است، اما رویکرد خوبی برای توسعه نرم افزار نیست.

لطفا اطلاعات اضافه کنید

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

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

public void persistCustomer(Customer c) ( // persist a Customer ) public void managementCustomer(Customer c) MyBusinessException را پرتاب می کند ( // مدیریت یک مشتری پرتاب جدید MyBusinessException(e, e.getCode()); ) public void createCustomer(Customer c) MyBusinessException را پرتاب می کند ( // ایجاد یک Customer managementCustomer(c)؛ )

استثنا چیست؟

استثنا رویدادی است که جریان عادی اجرا را قطع می کند. این یک اختلال در اجرای برنامه جاوا است.

در این آموزش، شما یاد خواهید گرفت که

دو نوع خطا وجود دارد:

  1. کامپایل خطاهای زمانی
  2. خطاهای زمان اجرا

خطاهای زمان کامپایل را می توان دوباره به دو نوع طبقه بندی کرد:

  • خطاهای نحوی
  • خطاهای معنایی

مثال خطای نحوی:

به جای اعلام int a; شما به اشتباه آن را به صورت a اعلام کردید. برای کدام کامپایلر خطا می دهد.

مثال: شما یک متغیر int a را اعلام کرده اید; و بعد از چند خط کد دوباره یک عدد صحیح را به عنوان int a اعلام می کنید. . همه این خطاها هنگام کامپایل کد برجسته می شوند.

مثال خطای زمان اجرا

یک خطای Runtime an نامیده می شود استثناهاخطا هر رویدادی است که جریان عادی اجرای برنامه را قطع کند.

مثال برای استثناها عبارتند از: استثنا حسابی، استثنای Nullpointer، تقسیم بر صفر استثنا و غیره.

استثناها در جاوا چیزی است که خارج از کنترل توسعه دهندگان است.

چرا به استثنا نیاز داریم؟

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

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

نحوه رسیدگی به استثنا

تا اینجا شاهد بودیم که استثنا خارج از کنترل توسعه دهنده است.اما سرزنش شکست کد خود به خاطر مسائل زیست محیطی راه حلی نیست.شما به یک برنامه نویسی قوی نیاز دارید که از موقعیت های استثنایی مراقبت می کند. چنین کدهایی به عنوان شناخته شده هستند. کنترل کننده استثنا

در مثال ما، مدیریت استثنایی خوب این است که وقتی سرور خاموش است، به سرور پشتیبان متصل شوید.

برای پیاده سازی این، کد خود را برای اتصال به سرور وارد کنید (با استفاده از شرایط سنتی if و else).

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

چنین سازماندهی کد، با استفاده از حلقه "if" و "else" زمانی موثر نیست که کد شما دارای چندین استثنا در جاوا باشد.

Class connect( if(Server Up)( // کد اتصال به سرور ) other( // کد اتصال به سرور BACKUP ) )

Catch Block را امتحان کنید

جاوا یک مدیریت استثنایی داخلی را ارائه می دهد.

  1. کد معمولی وارد a می شود تلاش كردنمسدود کردن.
  2. کد رسیدگی به استثنا وارد قسمت می شود گرفتنمسدود کردن

در مثال ما، بلوک TRY حاوی کد اتصال به سرور است. بلوک CATCH حاوی کد اتصال به سرور پشتیبان است.

در صورت فعال بودن سرور، کد موجود در بلوک CATCH نادیده گرفته می شود. در صورتی که سرور از کار بیفتد، یک استثنا مطرح می شود و کد موجود در بلوک catch اجرا می شود.

بنابراین، به این صورت است که استثنا در جاوا مدیریت می شود.

نحو برای استفاده از try & catch

امتحان کنید(گزاره(های) ) catch (exceptiontype name) (گزاره(های))

مرحله 1)کد زیر را در یک ویرایشگر کپی کنید

کلاس JavaException ( اصلی خالی استاتیک عمومی (Args رشته) (int d = 0; int n = 20; int fraction = n/d; System.out.println ("End Of Main"); ))

گام 2)فایل را ذخیره و کد را کامپایل کنید. برنامه را با استفاده از دستور java JavaException اجرا کنید

مرحله 3)یک استثنای حسابی - تقسیم بر صفر برای خط 5 به صورت زیر نشان داده شده است و خط شماره 6 هرگز اجرا نمی شود.

مرحله 4)حال اجازه دهید ببینیم که چگونه try and catch به ما در مدیریت این استثنا کمک می کند. تلاش كردنبلوک و به دنبال آن a گرفتنمسدود کردن. کد زیر را در ویرایشگر کپی کنید.

کلاس JavaException ( عمومی استاتیک void main (string args) ( int d = 0; int n = 20; try ( int fraction = n / d; System.out.println ("این خط اجرا نمی شود"); ) catch ( ArithmeticException e) ( System.out.println ("در بلوک catch به دلیل استثنا = " + e)؛ ) System.out.println ("End Of Main"); ) )

مرحله 5)کد را ذخیره، کامپایل و اجرا کنید. خروجی زیر را دریافت خواهید کرد

همانطور که مشاهده می کنید، استثنا مدیریت می شود و آخرین خط کد نیز اجرا می شود. همچنین توجه داشته باشید که خط شماره ۷ اجرا نخواهد شد زیرا به محض اینکه یک استثنا مطرح شود، جریان کنترل به بلوک catch می پرد.

توجه داشته باشید: AritmeticException Object "e" حاوی اطلاعاتی در مورد استثنایی است که رخ داده است که می تواند در انجام اقدامات بازیابی مفید باشد.

سلسله مراتب کلاس استثنایی جاوا

پس از اجرای یک دستور catch، بقیه دستورات دور زده می شوند و اجرا بعد از بلوک try/catch ادامه می یابد. بلوک‌های catch تودرتو از سلسله مراتب استثنا پیروی می‌کنند.
  • همه کلاس های استثنا در جاوا کلاس "Throwable" را گسترش می دهند. Throwable دارای دو زیر کلاس Error و Exception است
  • کلاس Error استثنا یا مشکلاتی را که انتظار نمی رود در شرایط عادی توسط برنامه ما رخ دهد را تعریف می کند، به عنوان مثال خطای حافظه، خطای سخت افزار، خطای JVM و غیره.
  • کلاس Exception استثناهایی را نشان می دهد که می تواند توسط برنامه ما مدیریت شود و برنامه ما را می توان با استفاده از بلوک try و catch از این استثنا بازیابی کرد.
  • یک Runtime استثنا یک زیر کلاس از کلاس استثنا است. Exception از این نوع نشان دهنده استثنایی است که در زمان اجرا رخ می دهد و در زمان کامپایل قابل ردیابی نیست. یک مثال عالی از همان تقسیم بر صفر استثنا، یا استثنای اشاره گر تهی و غیره است
  • استثنا IO در طول عملیات ورودی و خروجی ایجاد می شود
  • استثناهای قطع شده در جاوا، در طول رشته های متعدد ایجاد می شود.
مثال:برای درک تودرتو بلوک های try and catch

مرحله 1)

کلاس JavaException ( عمومی استاتیک void main(string args) ( try (int d = 1; int n = 20; int fraction = n / d; int g = ( 1 ); g = 100; ) /*catch (Exception e) ( System.out.println("In the catch clock due to Exception = "+e); )*/ catch (ArithmeticException e) ( System.out.println("In the catch clock due to Exception = " + e); ) catch (ArrayIndexOutOfBoundsException e) ( System.out.println("در ساعت catch به دلیل Exception = " + e)؛ ) System.out.println("End Of Main"); ) )

گام 2)فایل را ذخیره و کد را کامپایل کنید. با استفاده از دستور برنامه را اجرا کنید java JavaException.

مرحله 3)یک ArrayIndexOutOfBoundsException ایجاد می شود. مقدار int d را به 0 تغییر دهید. کد را ذخیره، کامپایل و اجرا کنید.

مرحله 4) یک ArithmeticException باید ایجاد شود.

مرحله 5)از خط شماره 10 به خط شماره 12 کامنت بردارید. کد را ذخیره، کامپایل و اجرا کنید.

مرحله 6) خطای تالیف؟این به این دلیل است که Exception کلاس پایه ArithmeticException Exception است. هر استثنایی که توسط ArithmeticException ایجاد می‌شود، می‌تواند توسط کلاس Exception نیز مدیریت شود. بنابراین بلوک catch ArithmeticException هرگز فرصتی برای اجرا پیدا نمی‌کند که آن را اضافی می‌کند. از این رو خطای کامپایل.

جاوا در نهایت بلوک

بلوک نهایی است بدون توجه به اینکه استثنایی مطرح شده باشد، اجرا می شوددر بلوک تلاش این است اختیاریبرای استفاده با یک بلوک try.

امتحان کنید ( عبارت(ها)) catch (ExceptiontType name) (گزاره(ها)) در نهایت (گزاره(های))

در صورتی که یک استثنا در بلوک try مطرح شود، در نهایت بلوک پس از اجرای بلوک catch اجرا می شود.

مرحله 1)کد زیر را در یک ویرایشگر کپی کنید.

کلاس JavaException ( public void main(string args)( try( int d = 0; int n = 20; int fraction = n/d; ) catch(ArithmeticException e)( System.out.println ("در ساعت catch due به Exception = "+e); ) در نهایت( System.out.println("داخل بلوک نهایی"); ) ) )

گام 2)کد را ذخیره، کامپایل و اجرا کنید.

مرحله 3)خروجی مورد انتظار در نهایت بلوک اجرا می شود حتی اگر یک استثنا مطرح شود.

مرحله 4)مقدار متغیر d = 1 را تغییر دهید. کد را ذخیره، کامپایل و اجرا کنید و خروجی را مشاهده کنید. پایین فرم

خلاصه:

  • یک استثنا یک خطای زمان اجرا استکه جریان عادی اجرای برنامه را قطع می کند.اختلال در اجرای برنامه به عنوان خطا یا استثنا نامیده می شود.
  • خطاها به دو دسته طبقه بندی می شوند
    • کامپایل خطاهای زمانی - خطاهای نحوی، خطاهای معنایی
    • خطاهای زمان اجرا - استثنا
  • آ برنامه قوی باید همه استثناها را مدیریت کندو به جریان عادی اجرای برنامه خود ادامه دهد. جاوا یک روش مدیریت استثنایی داخلی را ارائه می دهد
  • Exception Handler مجموعه ای از کدهاست که یک استثنا را اداره می کند. استثناها را می توان با استفاده از try & catch در جاوا کنترل کرد.
  • بلوک را امتحان کنید: کد معمولی روی این بلوک می رود.
  • بلوک گرفتن: اگر در کد معمولی خطایی وجود داشته باشد، به این بلوک می رود

برترین مقالات مرتبط