มีคนอธิบายความแตกต่างระหว่างjava.lang.RuntimeException
และjava.lang.Exception
? ฉันจะตัดสินใจว่าจะขยายเวลาใดหากฉันสร้างข้อยกเว้นของตัวเอง
มีคนอธิบายความแตกต่างระหว่างjava.lang.RuntimeException
และjava.lang.Exception
? ฉันจะตัดสินใจว่าจะขยายเวลาใดหากฉันสร้างข้อยกเว้นของตัวเอง
คำตอบ:
โดยทั่วไปRuntimeExceptionsเป็นข้อยกเว้นที่สามารถป้องกันได้โดยทางโปรแกรม เช่น ,NullPointerException
ArrayIndexOutOfBoundException
หากคุณตรวจสอบnull
ก่อนโทรวิธีใด ๆNullPointerException
จะไม่เกิดขึ้น ในทำนองเดียวกันArrayIndexOutOfBoundException
จะไม่เกิดขึ้นหากคุณตรวจสอบดัชนีก่อน RuntimeException
ไม่ได้ตรวจสอบโดยคอมไพเลอร์ดังนั้นจึงเป็นรหัสที่สะอาด
แก้ไข : คนสมัยนี้ชอบRuntimeException
เพราะรหัสสะอาดมันผลิต มันเป็นตัวเลือกส่วนบุคคลโดยสิ้นเชิง
RuntimeException
ก็เพราะมันเป็นเรื่องง่ายและ obviates จำเป็นต้องคิดเกี่ยวกับความแตกต่างระหว่างข้อยกเว้นที่เลือกและไม่ได้ตรวจสอบ NullPointerException
ผมคิดว่าการจับข้อยกเว้นรันไทม์เป็นความคิดที่น่ากลัวเพราะคุณจะจับข้อยกเว้นที่ไม่สามารถกู้เช่น
ใน Java มีข้อยกเว้นสองประเภท: ข้อยกเว้นที่ตรวจสอบและข้อยกเว้นที่ไม่ได้ตรวจสอบ ข้อยกเว้นที่ตรวจสอบจะต้องได้รับการจัดการอย่างชัดเจนโดยรหัสในขณะที่ข้อยกเว้นที่ไม่ได้ตรวจสอบไม่จำเป็นต้องได้รับการจัดการอย่างชัดเจน
สำหรับข้อยกเว้นที่เลือกคุณต้องใส่บล็อก try / catch รอบ ๆ โค้ดที่อาจทำให้เกิดข้อยกเว้นหรือเพิ่มส่วน "throws" ลงในเมธอดเพื่อระบุว่าวิธีนี้อาจทำให้เกิดข้อยกเว้นประเภทนี้ (ซึ่งจะต้องเป็น จัดการในระดับการโทรหรือสูงกว่า)
ข้อยกเว้นใด ๆ ที่เกิดขึ้นจาก "ข้อยกเว้น" เป็นข้อยกเว้นที่ตรวจสอบแล้วในขณะที่คลาสที่มาจาก RuntimeException จะไม่ถูกตรวจสอบ RuntimeExceptions ไม่จำเป็นต้องได้รับการจัดการอย่างชัดเจนโดยรหัสการโทร
ก่อนที่จะดูความแตกต่างระหว่างjava.lang.RuntimeException
และjava.lang.Exception
คลาสคุณต้องทราบException
ลำดับชั้น ทั้งคลาสException
และError
มาจากคลาสThrowable
(ซึ่งมาจากคลาสObject
) และชั้นเรียนมาจากชั้นRuntimeException
Exception
ข้อยกเว้นทั้งหมดจะได้มาทั้งจากหรือException
RuntimeException
ข้อยกเว้นทั้งหมดที่ได้รับมาRuntimeException
จะเรียกว่าข้อยกเว้นที่ไม่ได้ตรวจสอบ และข้อยกเว้นอื่น ๆ ทั้งหมดจะถูกตรวจสอบข้อยกเว้น ต้องมีการตรวจสอบข้อยกเว้นที่ตรวจสอบแล้วบางแห่งในรหัสของคุณมิฉะนั้นจะไม่สามารถรวบรวม นั่นคือเหตุผลที่พวกเขาเรียกว่าข้อยกเว้นที่ตรวจสอบแล้ว ในขณะที่มีข้อยกเว้นที่ไม่ได้ตรวจสอบวิธีการโทรไม่มีภาระผูกพันในการจัดการหรือประกาศ
ดังนั้นทุกข้อยกเว้นที่กองกำลังเรียบเรียงให้คุณจับได้มาโดยตรงจากjava.lang.Exception
และอื่น ๆ java.lang.RuntimeException
ทั้งหมดซึ่งคอมไพเลอร์ไม่ได้บังคับให้คุณจับได้มาจาก
ต่อไปนี้คือบางส่วนของ subclasses ที่รู้จักกันโดยตรงของRuntimeException
AnnotationTypeMismatchException,
ArithmeticException,
ArrayStoreException,
BufferOverflowException,
BufferUnderflowException,
CannotRedoException,
CannotUndoException,
ClassCastException,
CMMException,
ConcurrentModificationException,
DataBindingException,
DOMException,
EmptyStackException,
EnumConstantNotPresentException,
EventException,
IllegalArgumentException,
IllegalMonitorStateException,
IllegalPathStateException,
IllegalStateException,
ImagingOpException,
IncompleteAnnotationException,
IndexOutOfBoundsException,
JMRuntimeException,
LSException,
MalformedParameterizedTypeException,
MirroredTypeException,
MirroredTypesException,
MissingResourceException,
NegativeArraySizeException,
NoSuchElementException,
NoSuchMechanismException,
NullPointerException,
ProfileDataException,
ProviderException,
RasterFormatException,
RejectedExecutionException,
SecurityException,
SystemException,
TypeConstraintException,
TypeNotPresentException,
UndeclaredThrowableException,
UnknownAnnotationValueException,
UnknownElementException,
UnknownTypeException,
UnmodifiableSetException,
UnsupportedOperationException,
WebServiceException
มีการตรวจสอบข้อยกเว้นและ RuntimeException ไม่ถูกตรวจสอบ
การตรวจสอบหมายความว่าคอมไพเลอร์ต้องการให้คุณจัดการกับข้อยกเว้นในการดักจับหรือประกาศวิธีการของคุณในการขว้างมัน (หรือหนึ่งในซูเปอร์คลาสของมัน)
โดยทั่วไปให้โยนข้อยกเว้นที่ตรวจสอบหากผู้เรียกใช้ API คาดว่าจะจัดการกับข้อยกเว้นและข้อยกเว้นที่ไม่ได้ตรวจสอบหากเป็นสิ่งที่ผู้เรียกจะไม่สามารถจัดการได้เช่นข้อผิดพลาดกับพารามิเตอร์ตัวใดตัวหนึ่งเช่นการเขียนโปรแกรม ผิดพลาด
คลาสยกเว้นของรันไทม์ (RuntimeException และคลาสย่อย) ได้รับการยกเว้นจากการตรวจสอบเวลาคอมไพล์เนื่องจากคอมไพเลอร์ไม่สามารถสร้างข้อยกเว้นรันไทม์ที่ไม่สามารถเกิดขึ้นได้ (จาก JLS)
ในคลาสที่คุณออกแบบคุณควรคลาสย่อยExceptionและส่งอินสแตนซ์ของมันเพื่อส่งสัญญาณสถานการณ์พิเศษต่างๆ การทำเช่นนั้นคุณจะส่งสัญญาณลูกค้าของชั้นเรียนของคุณอย่างชัดเจนว่าการใช้ชั้นเรียนของคุณอาจทำให้เกิดข้อยกเว้นและพวกเขาต้องทำตามขั้นตอนเพื่อจัดการสถานการณ์พิเศษ
ตัวอย่างโค้ดด้านล่างอธิบายจุดนี้:
//Create your own exception class subclassing from Exception
class MyException extends Exception {
public MyException(final String message) {
super(message);
}
}
public class Process {
public void execute() {
throw new RuntimeException("Runtime");
}
public void process() throws MyException {
throw new MyException("Checked");
}
}
ในการกำหนดระดับของชั้นดังกล่าวข้างต้นกระบวนการวิธีการที่execute
สามารถโยนRuntimeExceptionแต่ไม่ใช่วิธีการประกาศจำเป็นต้องระบุว่ามันจะพ่นRuntimeException
วิธีการprocess
โยนข้อยกเว้นที่ตรวจสอบและควรประกาศว่าจะโยนข้อยกเว้นที่ตรวจสอบประเภทMyExceptionและไม่ทำเช่นนั้นจะเป็นข้อผิดพลาดในการรวบรวม
นิยามคลาสข้างต้นจะมีผลกับรหัสที่ใช้คลาสProcessเช่นกัน
การเรียกnew Process().execute()
เป็นการเรียกใช้ที่ถูกต้องเนื่องจากการเรียกใช้แบบฟอร์ม
new Process().process()
ทำให้เกิดข้อผิดพลาดในการคอมไพล์ นี่เป็นเพราะรหัสลูกค้าควรทำตามขั้นตอนในการจัดการMyException
(พูดการเรียกไปยังกระบวนการ () สามารถอยู่ใน try / catch block)
ใช้ RuntimeException อย่างเหมาะสมหรือไม่
จากข้อยกเว้นที่ไม่ได้ตรวจสอบ - ความขัดแย้ง :
หากลูกค้าสามารถคาดว่าจะกู้คืนจากข้อยกเว้นให้มันเป็นข้อยกเว้นที่ตรวจสอบ หากลูกค้าไม่สามารถทำการกู้คืนจากข้อยกเว้นได้ให้ทำให้เป็นข้อยกเว้นที่ไม่ได้ตรวจสอบ
โปรดทราบว่าข้อยกเว้นที่ไม่ได้เลือกเป็นหนึ่งที่ได้มาจากและข้อยกเว้นการตรวจสอบเป็นหนึ่งที่ได้มาจากRuntimeException
Exception
ทำไมต้องโยน a RuntimeException
หากลูกค้าไม่สามารถทำอะไรเพื่อกู้คืนจากข้อยกเว้น? บทความอธิบาย:
ข้อยกเว้นรันไทม์แสดงถึงปัญหาที่เป็นผลมาจากปัญหาการเขียนโปรแกรมและดังนั้นรหัสลูกค้า API ไม่สามารถคาดว่าจะกู้คืนได้จากพวกเขาหรือเพื่อจัดการกับพวกเขาในทางใดทางหนึ่ง ปัญหาดังกล่าวรวมถึงข้อยกเว้นทางคณิตศาสตร์เช่นการหารด้วยศูนย์ ข้อยกเว้นของตัวชี้เช่นพยายามเข้าถึงวัตถุผ่านการอ้างอิงแบบ null และข้อยกเว้นการจัดทำดัชนีเช่นการพยายามเข้าถึงองค์ประกอบอาร์เรย์ผ่านดัชนีที่มีขนาดใหญ่เกินไปหรือเล็กเกินไป
จากเอกสาร oracle:
ต่อไปนี้เป็นหลักเกณฑ์ด้านล่าง: หากลูกค้าคาดว่าจะสามารถกู้คืนจากข้อยกเว้นให้เป็นข้อยกเว้นที่ตรวจสอบ หากลูกค้าไม่สามารถทำการกู้คืนจากข้อยกเว้นได้ให้ทำให้เป็นข้อยกเว้นที่ไม่ได้ตรวจสอบ
ข้อยกเว้นรันไทม์แสดงถึงปัญหาที่เป็นผลมาจากปัญหาการเขียนโปรแกรมและดังนั้นรหัสลูกค้า API ไม่สามารถคาดว่าจะกู้คืนได้จากพวกเขาหรือเพื่อจัดการกับพวกเขาในทางใดทางหนึ่ง
RuntimeExceptions เป็นเหมือน "ข้อยกเว้นจากการใช้ API ที่ไม่ถูกต้อง" ตัวอย่างของ runtimeexceptions: IllegalStateException, NegativeArraySizeException, NullpointerException
ด้วยข้อยกเว้นคุณต้องจับมันอย่างชัดเจนเพราะคุณยังสามารถทำบางสิ่งบางอย่างในการกู้คืน ตัวอย่างของข้อยกเว้นคือ: IOException, TimeoutException, PrintException ...
ในคำง่ายๆถ้าลูกค้า / ผู้ใช้ของคุณสามารถกู้คืนจากข้อยกเว้นแล้วทำให้มันเป็นยืม ยกเว้นถ้าลูกค้าของคุณไม่สามารถทำอะไรที่จะกู้คืนจากการยกเว้นแล้วทำให้มันไม่ได้ตรวจสอบ RuntimeException เช่นเป็น RuntimeException จะเป็นความผิดพลาดในการเขียนโปรแกรมเช่นหารด้วยศูนย์ผู้ใช้ที่ไม่สามารถทำอะไรกับมัน แต่โปรแกรมเมอร์ตัวเองแล้วมันเป็นRuntimeException
RuntimeException เป็นคลาสลูกของคลาสข้อยกเว้น
นี่เป็นหนึ่งในคลาสย่อยของคลาส Exception RuntimeException เป็นซูเปอร์คลาสของข้อยกเว้นเหล่านั้นที่สามารถโยนได้ระหว่างการทำงานปกติของ Java Virtual Machine วิธีการไม่จำเป็นต้องประกาศในการส่งประโยคย่อยคลาสใด ๆ ของ RuntimeException ที่อาจถูกโยนทิ้งในระหว่างการดำเนินการของวิธีการ แต่ไม่ถูกจับ
ลำดับชั้นคือ
java.lang.Object
--- java.lang.Throwable
------- java.lang.Exception
------------- java.lang.RuntimeException
ข้อยกเว้นเป็นวิธีที่ดีในการจัดการเหตุการณ์ที่ไม่คาดคิดในโฟลว์แอปพลิเคชันของคุณ RuntimeException ไม่ได้ถูกตรวจสอบโดยคอมไพเลอร์ แต่คุณอาจต้องการใช้ข้อยกเว้นที่ขยาย Exception Class เพื่อควบคุมพฤติกรรมของไคลเอนต์ API ของคุณเนื่องจากพวกเขาจำเป็นต้องรวบรวมข้อผิดพลาดเพื่อให้คอมไพล์ สร้างเอกสารที่ดีด้วย
หากต้องการบรรลุอินเตอร์เฟสที่สะอาดให้ใช้การสืบทอดเพื่อแบ่งประเภทย่อยของข้อยกเว้นชนิดต่าง ๆ ที่แอ็พพลิเคชันของคุณมีแล้วแสดงข้อยกเว้นพาเรนต์
มีข้อยกเว้นสองประเภทคุณสามารถกู้คืนจากข้อยกเว้นที่ตรวจสอบได้หากคุณได้รับข้อยกเว้นดังกล่าว ข้อยกเว้นรันไทม์ไม่สามารถกู้คืนได้ข้อยกเว้นรันไทม์เป็นข้อผิดพลาดในการเขียนโปรแกรมและโปรแกรมเมอร์ควรดูแลในขณะที่เขียนรหัสและดำเนินการต่อของการดำเนินการนี้อาจให้ผลลัพธ์ที่ไม่ถูกต้อง ข้อยกเว้นรันไทม์เกี่ยวกับการละเมิดเงื่อนไขก่อนหน้า คุณมีอาร์เรย์ขนาด 10 และคุณพยายามเข้าถึงองค์ประกอบที่ 11 มันจะโยน ArrayIndexOutOfBoundException
ข้อยกเว้นที่ผู้ใช้กำหนดสามารถเป็น Checked Exception หรือ Unchecked Exception ขึ้นอยู่กับคลาสที่ขยาย
ข้อยกเว้นที่ผู้ใช้กำหนดสามารถเป็นข้อยกเว้นแบบกำหนดเองที่ตรวจสอบได้หากมันขยายไปถึงคลาสข้อยกเว้น
ข้อยกเว้นที่ผู้ใช้กำหนดสามารถเป็นข้อยกเว้นแบบกำหนดเองที่กำหนดเองได้หากขยายไปยังคลาสข้อยกเว้นรันไทม์
กำหนดชั้นเรียนและทำให้เด็กเป็น Exception หรือ Run time Exception