ใช่ constructors สามารถโยน exception ใน Java ได้
Constructor เป็นประเภทพิเศษของเมธอดที่ใช้ initialize object และใช้สร้าง object ของคลาสโดยใช้ new keyword โดย object ยังเรียกว่า Instance ของคลาส ทุก object ของคลาสจะมี state ของตัวเอง (Instance variables) และเข้าถึงเมธอดของคลาสได้
การโยน Exception จาก Constructor
- Checked exception ใช้ระบุปัญหาที่ถูกต้องเมื่อพยายามสร้าง instance ในขณะที่ unchecked exception มักระบุ bug ใน client code หรือใน constructor เอง
- ในทั้งสองกรณี object ถูกจัดสรรใน heap space จริงๆ แต่ reference ไม่ได้ถูกคืน Object คงอยู่ในสถานะ partially initialized จนกว่าจะถูก garbage collected ดังนั้นการเก็บ reference ไปยัง object จาก constructor เอง (โดยใช้ reference this) เป็นเรื่องเสี่ยง เนื่องจากอาจให้เข้าถึง object ในสถานะที่ไม่ถูกต้อง
- สิ่งสำคัญอีกอย่างเกี่ยวกับ exception ใน constructor คือเกี่ยวกับ reflection เมื่อเราต้องการ invoke empty constructor โดยใช้ class object เช่น test เราบางครั้งใช้เมธอด test.newInstance()
- Exception ใดๆ ที่โยนโดย constructors จะถูก propagate ไปโดยไม่เปลี่ยนแปลง กล่าวคือ เมธอด newInstance() อาจโยน checked exception ที่มันไม่ได้ declare ไว้
ตัวอย่าง
public class ConstructorExceptionTest {
public ConstructorExceptionTest() throws InterruptedException {
System.out.println("Preparing an Object");
Thread.sleep(1000);
System.out.println("Object is ready");
}
public static void main(String args[]) {
try {
ConstructorExceptionTest test = new ConstructorExceptionTest();
} catch (InterruptedException e) {
System.out.println("Got interrupted...");
}
}
}
ผลลัพธ์
Preparing an Object Object is ready