เราจะสร้างข้อยกเว้นที่กำหนดเองใน Java ได้อย่างไร
เราจะสร้างข้อยกเว้นที่กำหนดเองใน Java ได้อย่างไร
คำตอบ:
เพื่อกำหนดตรวจสอบข้อยกเว้นคุณสร้าง subclass (หรือลำดับชั้นของ subclasses) java.lang.Exception
ของ ตัวอย่างเช่น:
public class FooException extends Exception {
public FooException() { super(); }
public FooException(String message) { super(message); }
public FooException(String message, Throwable cause) { super(message, cause); }
public FooException(Throwable cause) { super(cause); }
}
วิธีการที่อาจโยนหรือเผยแพร่ข้อยกเว้นนี้จะต้องประกาศ:
public void calculate(int i) throws FooException, IOException;
... และโค้ดที่เรียกใช้เมธอดนี้ต้องจัดการหรือเผยแพร่ข้อยกเว้นนี้ (หรือทั้งสองอย่าง):
try {
int i = 5;
myObject.calculate(5);
} catch(FooException ex) {
// Print error and terminate application.
ex.printStackTrace();
System.exit(1);
} catch(IOException ex) {
// Rethrow as FooException.
throw new FooException(ex);
}
คุณจะสังเกตเห็นในตัวอย่างข้างต้นที่IOException
ถูกจับได้และ rethrown FooException
เป็น นี่เป็นเทคนิคทั่วไปที่ใช้ในการสรุปแค็ปซูล (โดยทั่วไปเมื่อใช้งาน API)
บางครั้งจะมีสถานการณ์ที่คุณไม่ต้องการบังคับให้ทุกวิธีในการประกาศการใช้งานข้อยกเว้นของคุณในประโยคข้อผิดพลาด ในกรณีนี้คุณสามารถสร้างข้อยกเว้นที่ไม่ได้ตรวจสอบได้ ข้อยกเว้นที่ไม่ได้ตรวจสอบคือข้อยกเว้นใด ๆ ที่ขยายjava.lang.RuntimeException
(ซึ่งตัวมันเองเป็นคลาสย่อยjava.lang.Exception
):
public class FooRuntimeException extends RuntimeException {
...
}
วิธีการสามารถโยนหรือเผยแพร่FooRuntimeException
ข้อยกเว้นโดยไม่ต้องประกาศ เช่น
public void calculate(int i) {
if (i < 0) {
throw new FooRuntimeException("i < 0: " + i);
}
}
โดยทั่วไปข้อยกเว้นที่ไม่ได้ตรวจสอบจะใช้เพื่อแสดงถึงข้อผิดพลาดของโปรแกรมเมอร์เช่นการส่งอาร์กิวเมนต์ที่ไม่ถูกต้องไปยังวิธีการหรือพยายามฝ่าฝืนขอบเขตดัชนีอาร์เรย์
java.lang.Throwable
ระดับเป็นรากของข้อผิดพลาดและข้อยกเว้นทั้งหมดที่สามารถโยนภายใน Java java.lang.Exception
และมีทั้งคลาสย่อยjava.lang.Error
Throwable
สิ่งใดก็ตามที่คลาสย่อยThrowable
นั้นอาจถูกโยนหรือถูกจับได้ อย่างไรก็ตามโดยทั่วไปแล้วมันเป็นวิธีปฏิบัติที่ไม่ดีในการจับหรือโยนError
เนื่องจากสิ่งนี้ใช้เพื่อแสดงถึงข้อผิดพลาดภายใน JVM ที่ไม่สามารถ "จัดการ" โดยโปรแกรมเมอร์ (เช่นOutOfMemoryError
) ในทำนองเดียวกันคุณควรหลีกเลี่ยงการจับThrowable
ซึ่งอาจส่งผลให้คุณจับError
นอกเหนือจากException
s
public class MyException extends Exception {
// special exception code goes here
}
โยนมันเป็น:
throw new MyException ("Something happened")
จับเป็น:
catch (MyException e)
{
// something
}
สำหรับข้อยกเว้นที่ตรวจสอบ:
public class MyCustomException extends Exception { }
ในทางเทคนิคสิ่งใดก็ตามที่ขยายออกไปThrowable
อาจเป็นตัวโยน แต่โดยทั่วไปแล้วข้อยกเว้นจะเป็นส่วนขยายของException
คลาสเพื่อให้พวกเขากำลังตรวจสอบข้อยกเว้น (ยกเว้น RuntimeException หรือคลาสที่ยึดตามซึ่งไม่ได้ตรวจสอบ) ซึ่งตรงข้ามกับประเภททั่วไปError
s ซึ่งมักจะไม่ใช่สิ่งที่ออกแบบมาให้จัดการอย่างงดงามเกินกว่า JVM ภายใน
คุณสามารถสร้างข้อยกเว้นที่ไม่เป็นสาธารณะได้ แต่จากนั้นคุณสามารถใช้ได้เฉพาะในแพ็คเกจที่กำหนดไว้เท่านั้น
เท่าที่มีการขว้าง / รับข้อยกเว้นแบบกำหนดเองมันทำงานเหมือนกับที่มีในตัว - ส่งผ่าน
throw new MyCustomException()
และจับผ่าน
catch (MyCustomException e) { }
Throwable
สามารถโยน ; Exception
ข้อยกเว้นขยาย คลาสย่อยที่กำหนดเองของ Throwable จะไม่ถูกtry { ... } catch (Exception e) { ... }
บล็อก
Error
ไม่ใช่ข้อยกเว้นเป็นข้อผิดพลาด) 3) แสดงว่ามีการตรวจสอบคลาสย่อยใด ๆ ของข้อยกเว้นในขณะที่ RuntimeException ไม่ได้รับการตรวจสอบ คำตอบที่ได้รับจาก Adamski นั้นแม่นยำกว่ามาก!