Static block คือชุดคำสั่งที่จะถูก execute โดย JVM ก่อนการ execute main() method ขณะโหลดคลาส หากเราต้องการทำกิจกรรมใดๆ เราต้องกำหนดกิจกรรมนั้นใน static block เพราะบล็อกนี้ execute ที่ เวลาโหลดคลาส (class loading)
การโยน Exception จาก Static Block
- Static block สามารถโยนได้แค่ RunTimeException หรือต้องมี try-catch block เพื่อจับ checked exception
- Static block เกิดขึ้นเมื่อคลาสถูกโหลดโดย class loader โค้ดอาจอยู่ในรูป static block หรือเป็นการเรียก static method เพื่อ initialize static data member
- ในทั้งสองกรณี checked exceptions ไม่อนุญาตโดยคอมไพเลอร์ เมื่อ unchecked exception เกิดขึ้น จะถูก wrap ด้วย ExceptionInInitializerError ซึ่งจะถูกโยนใน context ของ thread ที่กระตุ้น class loading
- การพยายามโยน checked exception จาก static block ก็ไม่ได้ เราสามารถมี try-catch block ใน static block ที่ checked exception อาจโยนจาก try block แต่เราต้อง resolve มันภายใน catch block ไม่สามารถ propagate ต่อด้วย throw keyword ได้
ตัวอย่าง
public class StaticBlockException {
static int i, j;
static {
System.out.println("In the static block");
try {
i = 0;
j = 10/i;
} catch(Exception e){
System.out.println("Exception while initializing" + e.getMessage());
throw new RuntimeException(e.getMessage());
}
}
public static void main(String args[]) {
StaticBlockException sbe = new StaticBlockException();
System.out.println("In the main() method");
System.out.println("Value of i is : "+i);
System.out.println("Value of j is : "+ j);
}
}
ผลลัพธ์
In the static block
Exception while initializing/ by zero
Exception in thread "main" java.lang.ExceptionInInitializerError
Caused by: java.lang.RuntimeException: / by zero
at StaticBlockException.(StaticBlockException.java:10)