Java Exception(finally)
توضیحات جلسه
جزوه و مستندات
مفاهیم کلیدی
- بلوک finally
بنایی در مدیریت استثناها که تضمین میکند کدهای داخل آن تحت هر شرایطی (چه Exception رخ دهد و چه ندهد) پس از بلوکهای try و catch اجرا شوند.
- Resource Management
فرآیند آزادسازی منابعی مانند اتصالات دیتابیس (Database Connections) یا فایلها که پس از اتمام کار باید حتماً بسته شوند تا از نشت حافظه یا اشغال بیهوده منابع جلوگیری شود.
- Checked Exception
نوعی از استثناها در جاوا که کامپایلر وجود آنها را بررسی میکند و برنامهنویس موظف است آنها را با ساختار try-catch مدیریت کرده یا در امضای متد اعلام (Specify) کند.
موارد مصاحبه ای
- آیا بلوک finally در صورت وجود دستور return باز هم اجرا میشود؟
بله، حتی اگر در بلوک try یا catch دستور return وجود داشته باشد، جاوا ابتدا کدهای داخل بلوک finally را اجرا کرده و سپس مقدار را برمیگرداند.
- هدف اصلی از معرفی بلوک finally چیست؟
جلوگیری از تکرار کد (Code Duplication) و اطمینان از اجرای کدهای حیاتی مانند بستن منابع، فارغ از موفقیت یا شکست عملیات اصلی.
- تفاوت اجرای برنامه با finally و بدون آن در مدیریت منابع چیست؟
بدون بلوک finally مجبوریم کد بستن منابع را هم در انتهای بلوک try و هم در داخل بلوک catch بنویسیم، اما با بلوک finally این کار فقط یکبار و با اطمینان کامل انجام میشود.
- آیا نوشتن بلوک finally اجباری است؟
خیر، استفاده از آن اختیاری است اما برای مدیریت صحیح منابع و نوشتن کد استاندارد، استفاده از آن ضروری محسوب میشود.
سناریو کاربردی
در این آموزش، سناریوی ساخت یک جدول در دیتابیس PostgreSQL بررسی شده است. وقتی میخواهیم با استفاده از متد executeUpdate() یک جدول ایجاد کنیم، دو حالت ممکن است رخ دهد:
۱. جدول وجود ندارد و با موفقیت ساخته میشود.
۲. جدول از قبل وجود دارد و یک SQLException رخ میدهد.
بدون استفاده از بلوک finally برای اینکه مطمئن شویم شیء PreparedStatement حتماً بسته میشود، باید متد close() را هم در انتهای مسیر موفقیتآمیز و هم در بلوک catch بنویسیم. اما با استفاده از بلوک finally تمامی این منطق تکراری حذف شده و دستور بسته شدن منبع در یک جای واحد قرار میگیرد که تحت هر دو شرایط (ساخته شدن جدول یا خطا به دلیل تکراری بودن) اجرا میشود.
بیشتر بدانید
- تکنولوژی جایگزین
در نسخههای جدیدتر جاوا، قابلیتی به نام try-with-resources معرفی شده است که مدیریت منابع و بستن خودکار آنها را بسیار سادهتر و کوتاهتر از بلوک finally انجام میدهد.
- نکته دیباگ
استفاده از متد printStackTrace() بر روی شیء Exception در لایههای توسعه به شما کمک میکند تا جزئیات دقیق خطا و مسیر رخ دادن آن را در کنسول مشاهده کنید.
- مدیریت خطای داخلی
توجه داشته باشید که خودِ دستور close() برای منابعی مثل Connection ممکن است Exception پرتاب کند، بنابراین گاهی لازم است داخل بلوک finally نیز از یک ساختار try-catch داخلی استفاده کنید.
