Java Exception(throw_throws)
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- throw
کیوردی که برای پرتاب صریح یک Exception در داخل بدنه کد استفاده میشود. زمانی که برنامهنویس تشخیص میدهد شرایط غیرعادی پیش آمده است، با استفاده از این کیورد روند عادی method را متوقف کرده و یک استثنا پرتاب میکند.
- throws
کیوردی که در امضای (Signature) متد نوشته میشود تا اعلام کند این method ممکن است یک یا چند استثنا پرتاب کند. این کیورد مسئولیت مدیریت استثنا را به لایههای بالاتر، یعنی فراخوانکننده متد، واگذار میکند.
- Checked Exception
استثناهایی که کامپایلر جاوا بررسی آنها را الزامی میداند. در استفاده از این نوع استثناها، حتماً باید یا از try-catch استفاده شود یا با کیورد throws در امضای متد اعلام شوند.
- Unchecked Exception
استثناهایی که از کلاس RuntimeException ارثبری میکنند. ذکر این استثناها در امضای متد با استفاده از throws اختیاری است و کامپایلر کاربر را مجبور به مدیریت آنها نمیکند.
- Exception Propagation
فرآیندی که در آن یک استثنا از پایینترین سطح فراخوانی، مثلاً یک متد داخلی، به سمت لایههای بالاتر، مانند متد main، پرتاب میشود تا زمانی که یک لایه مسئولیت handle کردن آن را بر عهده بگیرد.
موارد مصاحبه ای
- تفاوت اصلی throw و throws در چیست؟
throw برای پرتاب یک استثنا در بدنه کد، مانند یک دستور اجرایی، به کار میرود؛ اما throws در امضای متد برای اعلام احتمال وقوع استثنا و انتقال مسئولیت handle کردن آن استفاده میشود.
- آیا استفاده از throws برای تمام استثناها الزامی است؟
خیر. استفاده از این کیورد فقط برای Checked Exceptionها الزامی است. برای Unchecked Exceptionها، مانند ArithmeticException، استفاده از آن اختیاری است.
- قانون throws در ارثبری (Inheritance) چیست؟
اگر متد کلاس پدر استثنای خاصی را پرتاب نکند، متد کلاس فرزند در صورت Override کردن نمیتواند استثنای Checked جدیدی پرتاب کند. همچنین کلاس فرزند حق ندارد استثنایی گستردهتر (Broader) از استثنای کلاس پدر پرتاب کند و فقط میتواند استثناهای محدودتر، یعنی Subclassها، را اعلام کند.
- شباهت throw با return در چیست؟
هر دو کیورد باعث توقف ادامه اجرای کدهای آن method میشوند. با این تفاوت که return در شرایط عادی و برای برگرداندن مقدار استفاده میشود، اما throw در شرایط غیرعادی و برای اعلام خطا.
سناریو کاربردی
در ویدیو، سناریوی اعتبارسنجی سن کاربر بررسی شده است. فرض کنید برنامهای برای صدور گواهینامه دارید:
۱. سن کاربر دریافت میشود.
۲. متدی به نام validateAge طراحی شده است که سن را بررسی میکند.
۳. اگر سن کمتر از ۱۸ سال باشد، برنامهنویس با استفاده از throw new IllegalArgumentException() عمداً یک استثنا پرتاب میکند تا روند برنامه متوقف شود و پیام خطا نمایش داده شود.
۴. اگر سن ۱۸ یا بیشتر باشد، برنامه بدون مشکل ادامه پیدا میکند و پیام موفقیت چاپ میشود.
این مثال نشان میدهد که throw چگونه میتواند برای کنترل منطق برنامه در شرایط غیرمجاز استفاده شود.
بیشتر بدانید
- نکته معماری
پاس دادن مداوم استثناها به لایههای بالاتر با throws تا رسیدن به متد main، تمرین درستی نیست. در نهایت باید در یک لایه مناسب، استثنا با try-catch مدیریت شود تا برنامه بهصورت ناگهانی بسته نشود.
- Custom Exceptions
اگرچه میتوان از استثناهای آماده جاوا مانند ArithmeticException استفاده کرد، اما برای خوانایی بیشتر و مدیریت دقیقتر، بهتر است برای سناریوهای خاص خود از Custom Exceptionها استفاده کنید.
- IDE Tip
در محیط IntelliJ، اگر از متدی استفاده کنید که Checked Exception پرتاب میکند، محیط توسعه با خطای قرمز به شما هشدار میدهد. سپس با استفاده از میانبرهای پیشنهادی میتوانید بهسرعت try-catch یا throws را به امضای متد اضافه کنید.
