2012-07-18 43 views
12

Nói chung nếu bất kỳ lớp nào mở rộng Exception, nó sẽ trở thành ngoại lệ được kiểm tra. Runtime exception cũng mở rộng Ngoại lệ. Sau đó, làm thế nào là nó unchecked exception?Tại sao ngoại lệ thời gian chạy là ngoại lệ không được kiểm soát?

Có phải họ có kiểm tra tùy chỉnh trong trình biên dịch cho trường hợp đặc biệt này không?

EDIT: Tôi có ý tưởng đúng đắn về kiểm tra v/s ngoại lệ được kiểm soát và ưu của họ & cos vv Tôi không ngoại trừ sự khác biệt giữa chúng trong câu trả lời.

Trả lời

19

Đó là một cách rõ ràng trong đặc tả, section 11.1.1:

RuntimeException và tất cả các lớp con của nó là, tập thể, các lớp ngoại lệ runtime.

các lớp ngoại lệ không được kiểm tra là các lớp ngoại lệ thời gian chạy và các lớp lỗi.

Các lớp ngoại lệ được kiểm tra là tất cả các lớp ngoại lệ khác với các lớp ngoại lệ không được chọn. Đó là, các lớp ngoại lệ được kiểm tra là tất cả các lớp con của Throwable ngoài RuntimeException và các lớp con của nó và Error và các lớp con của nó.

Vì vậy, trình biên dịch chắc chắn biết về RuntimeException.

+0

lý do tại sao chúng tôi không thể kiểm tra ngoại lệ thời gian chạy? như chúng ta biết có thể là một NullPointerException thì chúng ta nên kiểm tra nó. bất kỳ ý tưởng? – UnKnown

+1

@ UnKnown: Không, bạn không muốn mọi phương thức bạn từng viết để bắt hoặc khai báo NullPointerException ... Điều đó thật khủng khiếp. –

+0

nó có nghĩa là khái niệm không có sự khác biệt giữa các trường hợp ngoại lệ đã kiểm tra và không được kiểm tra? chỉ cần thực hiện làm cho sự khác biệt? – UnKnown

7

Có. Bất kỳ Throwable là ngoại lệ được kiểm tra, ngoại trừ các lớp con Error, RuntimeException và (trực tiếp hoặc gián tiếp) của chúng.

Tuy nhiên, chúng được kiểm tra bởi trình biên dịch , không phải bởi JVM; ngoại lệ đã kiểm tra là tính năng biên dịch, không phải là tính năng thời gian chạy. (Cập nhật: Và bây giờ tôi thấy rằng bạn đã thay đổi nội dung câu hỏi của bạn để xác định "biên dịch" hơn là "JVM" ☺.)


Để xây dựng một chút nữa. . . nó không phải là mặc dù có bất kỳ loại giao diện "kiểm tra ngoại lệ". Logic chỉ đơn giản là mã hóa cứng: "bất kỳ lớp ngoại lệ nào là ngoại lệ được kiểm tra trừ khi đó là loại phụ của RuntimeException hoặc Error".

+0

+1 để chỉ ra rằng trình biên dịch kiểm tra Ngoại lệ. – DerMike

+0

cảm ơn vì điều đó. Đã cập nhật câu hỏi ☺ –

1

Dưới đây là một liên kết hữu ích: http://www.javapractices.com/topic/TopicAction.do?Id=129

Nó giải thích sự khác biệt giữa kiểm soát và kiểm tra và đưa ra một số ví dụ.

"Có hơi khó hiểu, nhưng cũng lưu ý rằng RuntimeException (bỏ chọn) chính là lớp con của Ngoại lệ (được chọn)."

0

Theo 11.1.1. các loại Exceptions

Một ngoại lệ được đại diện bởi một thể hiện của lớp Throwable (một lớp con trực tiếp của đối tượng) hoặc một trong các lớp con của nó.

Có thể ném và tất cả các lớp con của nó là các lớp ngoại lệ.

Lưu ý rằng một phân lớp của Throwable không được chung chung (§8.1.2).

Các lớp Ngoại lệ và Lỗi là các lớp con trực tiếp của Throwable.

Ngoại lệ là siêu lớp của tất cả các ngoại lệ mà từ đó các chương trình thông thường có thể muốn khôi phục.

Lỗi là siêu lớp của tất cả các ngoại lệ mà từ đó các chương trình thông thường thường không được khôi phục.

Lỗi và tất cả các lớp con của nó là các lớp lỗi.

Lỗi lớp là lớp con riêng biệt của Throwable, khác biệt với Ngoại lệ trong phân cấp lớp, cho phép chương trình sử dụng thành ngữ "} catch (Exception e) {" (§11.2.3) để nắm bắt tất cả các ngoại lệ phục hồi có thể được thực hiện mà không bị bắt lỗi mà từ đó phục hồi thường là không thể.

Lớp RuntimeException là một lớp con trực tiếp của Ngoại lệ. RuntimeException là siêu lớp của tất cả các ngoại lệ có thể được ném vì nhiều lý do trong quá trình đánh giá biểu thức, nhưng từ đó có thể vẫn có thể phục hồi.

RuntimeException và tất cả các lớp con của nó là các lớp ngoại lệ chạy theo thời gian.

Các lớp ngoại lệ không được chọn là các lớp ngoại lệ thời gian chạy và các lớp lỗi.

Các lớp ngoại lệ đã chọn là tất cả các lớp ngoại lệ ngoại trừ các lớp ngoại lệ không được chọn. Đó là, các lớp ngoại lệ được kiểm tra là tất cả các lớp con của Throwable ngoài RuntimeException và các lớp con của nó và Error và các lớp con của nó.

Các vấn đề liên quan