0 امتیاز
قبل در برنامه نویسی توسط (12 امتیاز)

سلام. لطفا به کد زیر توجه کنید:

public class Main {
  private static final SessionFactory ourSessionFactory;

  static {
    try {
      Configuration configuration = new Configuration();
      configuration.configure();

      ourSessionFactory = configuration.buildSessionFactory();
    } catch (Throwable ex) {
      throw new ExceptionInInitializerError(ex);
    }
  }

همانطور که مشاهده می‌کنید، بنده احتمال می‌دهم که از Chained Exception استفاده شده است؟ سوال من این است که چرا برنامه با خطای کامپایل مواجه نمیشه؟ باتوجه به اینکه آبجکت SessionFactory به صورت final تعریف شده، اما در خط مقدار دهی نشده.

1 پاسخ

+1 امتیاز
قبل توسط (255 امتیاز)
چون همون مقدار رو دارین تو بلاک استاتیک مقدار دهی می کنین. بلاک استاتیک قبل از هر چیزی حتی Constructor کلاس اجرا می شه. به همین دلیل کامپایلر از Initialize کردن متغیر مطمئن میشه.
قبل توسط (12 امتیاز)
ابتدا ممنون از پاسختون دوست عزیز.
اما سوال من اینه که (همانطور که در بالا توضیح دادم، از Chained Exception استفاده کرده) و اگر اکسپشنی که در بلاک کچ پرتاب شده را حذف کنیم (متلا stack trace را بنویسیم) با خطای کامپایل مواجه میشه.
قبل توسط (255 امتیاز)
+1
خب در سناریویی که Exception پرت شه اصلا initialize نمیشه. چون بلاک استاتیک فقط یکبار در زمان load کلاس اجرا میشه. این که چرا کامپایل اررو نمیگیرین بدلیلی اینه که اگه تو initialize مشکلی پیش بیاد و exception پرت شه، پس آبجکت نال هست و تو همون state اول میمونه و استفاده ازش منطقی نیست. پس یجوری اینو باید به کاربر استفاده کننده از API بگه که از طریق throw اینکار رو انجام میده در حالت قبلی که اگه دوباره re-throw نگنین، چون همینجا خطا رو هندل کردین ارور می گیرین.

سوالات مشابه

+2 امتیاز
2 پاسخ 2.2هزار بازدید
+1 امتیاز
1 پاسخ 803 بازدید
0 امتیاز
2 پاسخ 738 بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
0 امتیاز
1 پاسخ 1.7هزار بازدید
سوال شده 10 سال قبل در برنامه نویسی توسط Saeed Zarinfam (1.1هزار امتیاز)
+1 امتیاز
1 پاسخ 318 بازدید
0 امتیاز
1 پاسخ 1.2هزار بازدید
...