استثناء بررسی شده در مقابل استثنای زمان اجرا
استثناها نوع خاصی از رویدادها هستند که می توانند جریان عادی برنامه را مختل کنند. نام استثنا از "رویداد استثنایی" می آید. پرتاب یک استثنا، فرآیند ایجاد یک شی استثنا و تحویل آن به سیستم زمان اجرا است. هنگامی که سیستم زمان اجرا شی استثنا را دریافت می کند، سعی می کند با پیمایش آن به ترتیب معکوس (که در آن متدها فراخوانی شده اند، شخصی را پیدا کند که آن را در پشته فراخوانی مدیریت کند). سیستم زمان اجرا در صورتی موفق است که متدی را با یک کنترل کننده استثنا بیابد. Exception handler یک بلوک کد است که می تواند به طور رسمی استثناء مذکور را مدیریت کند.اگر سیستم زمان اجرا یک کنترل کننده مناسب پیدا کند، شی استثنا را به کنترل کننده ارسال می کند. به این میگن گرفتن استثنا. با این حال، اگر استثنا قابل رسیدگی نباشد، برنامه خاتمه می یابد. در جاوا، استثناها از کلاس Throwable به ارث می برند. Exception های علامت گذاری شده استثناهایی هستند که مدیریت آنها توسط کامپایلر اعمال می شود. استثناهای زمان اجرا نوعی استثنا هستند که توسط کامپایلر بررسی نمی شوند.
استثنای بررسی شده چیست؟
Checked Exceptions یا اشیایی از کلاس java.lang.exception یا زیر کلاس های آن هستند (به جز java.lang. RuntimeException و زیر کلاس های آن). استثناهای بررسی شده در زمان کامپایل "بررسی" می شوند. این بدان معناست که برنامه نویس باید یا این استثناها را بگیرد یا پرتاب کند، در غیر این صورت کامپایل شکایت می کند (که باعث خطای کامپایلر می شود). به همین دلیل، بسیاری از استثناهای بررسی شده برای برنامه نویسان بسیار شناخته شده هستند. به عنوان مثال، IOException و زیر کلاسهای آن به صورت استثنا بررسی میشوند، و هر زمان که برنامهنویس با دسترسی یا اصلاح یک فایل سروکار دارد، کامپایلر بررسی میکند تا مطمئن شود که تمام IOExceptionهای ممکن توسط برنامهنویس مراقبت میشوند.
استثنای زمان اجرا چیست؟
استثناهای زمان اجرا شامل java.lang. RuntimeException و همه زیر کلاس های آن است. از نظر تئوری، آنها همان هدف استثناهای بررسی شده را انجام می دهند و می توانند مانند استثناهای بررسی شده پرتاب شوند یا با آنها رفتار شود، اما مدیریت آنها توسط کامپایلر اجرا نمی شود. بنابراین، استثناهای Runtime متعلق به خانواده استثناهای بدون علامت هستند. NullPointerException، NumberFormatEception، ClassCastException و ArrayIndexOutOfBoundsException استثناهای رایج زمان اجرا در جاوا هستند.
تفاوت بین Checked Exception و Runtime Exception چیست؟
اگرچه، هم استثناهای بررسی شده و هم استثناهای زمان اجرا، اتفاقاتی ناخواسته در طول اجرای یک برنامه هستند، اما تفاوت های خود را دارند. کنترل استثناهای بررسی شده توسط کامپایلر اعمال می شود، اما استثناهای زمان اجرا اینطور نیستند. بنابراین، برای کامپایل شدن کد، استثناهای بررسی شده باید پرتاب یا مدیریت شوند، اما چنین الزامی در مورد استثناهای زمان اجرا وجود ندارد.در نتیجه، استثناهای زمان اجرا به همراه خطاها به دسته استثناهای بدون علامت تعلق دارند.
ایراد با استثناهای بررسی شده این است که برنامه نویس مجبور است آن را مدیریت کند، حتی اگر نداند چگونه این کار را انجام دهد. بنابراین، اگر برنامه نویس فقط یک استثنا جدید را بدون بسته بندی اصلی پرتاب کند، رد پشته متعلق به استثنای اصلی از بین خواهد رفت. اینجاست که استثناهای زمان اجرا مفید هستند. از آنجا که همه استثناهای زمان اجرا را می توان در یک مکان واحد مدیریت کرد، بنابراین برنامه نویسان می توانند مقدار کمتری کد بنویسند. از طرف دیگر، از آنجایی که استثناهای بررسی شده باید دستگیر شوند، هیچ تعجبی برای برنامه نویس وجود ندارد. او همیشه می داند که کدام استثنا بررسی شده می تواند با روش خاصی ایجاد شود. برخلاف این، استثناهای مختلف زمان اجرا را می توان بدون اطلاع برنامه نویس انجام داد.