2013-05-11 35 views
10

Lý do đằng sau ClassNotFoundException là ngoại lệ được kiểm tra là gì?Lý do cho ClassNotFoundException là ngoại lệ được kiểm tra

Tôi đã đoán và googling cố gắng hiểu lý do tại sao xem xét lớp học không được tìm thấy là ngoại lệ kiểm tra, bởi vì tất cả tâm trí của tôi nói với tôi rằng nó nên được bỏ chọn.

Trả lời

6

Ngoại lệ thường được kiểm tra khi người nhận có thể/nên thực hiện một số hành động có ý nghĩa để khắc phục sự cố trong thời gian chạy.

Unchecked Exceptions — The Controversy nói:

Đây là dòng hướng dẫn phía dưới: Nếu một khách hàng một cách hợp lý có thể được dự kiến ​​sẽ phục hồi từ một ngoại lệ, làm cho nó một ngoại lệ kiểm tra. Nếu một khách hàng không thể làm bất cứ điều gì để phục hồi từ các trường hợp ngoại lệ, làm cho nó một ngoại lệ không được kiểm soát.

Nguồn phổ biến nhất của ClassNotFoundException s là mã như

classLoader.loadClass(className); 

rằng phản tư tải một lớp dựa trên một tên được tìm thấy trong một tập tin cấu hình, đầu vào tuần tự, hoặc gọi thủ tục từ xa.

Điều này trái ngược với ClassNotFoundError thường xuất phát từ chương trình tĩnh được biên dịch với các lớp khác mà trình liên kết của JVM không thể tìm thấy khi chạy.

gì phân biệt các trường hợp phản sử dụng (kiểm tra) từ một thất bại để liên kết tĩnh mã biên dịch (lỗi runtime)?


Context

phản quang: Người gọi biết nơi chuỗi từ và lý do tại sao tải đã được thực hiện.

Tĩnh: Người gọi chỉ đang cố gắng sử dụng một lớp đã có sẵn tại thời gian biên dịch. Không có ngữ cảnh nào.

Khôi phục

Phản xạ: Người gọi có thể không thực hiện được hoặc thử chiến lược mặc định.

Tĩnh: Ngôn ngữ Java không hỗ trợ rõ ràng việc thay thế các điểm liên kết khác nhau.

rephrasing

phản quang: Caller thường nên chuyển đổi lỗi cho một loại khác nhau, như
một IOException về thất bại để deserialize.

Tĩnh: Nếu một phần của chương trình bị thiếu, bạn không thể dựa vào phần cần thiết của chương trình để giải thích tại sao một phần bị thiếu cho các phần khác.

4

A ClassNotFoundException được ném khi mã của bạn gọi Class.forName() trên tên lớp không thể được giải quyết cho một lớp trên đường dẫn lớp của ứng dụng của bạn (nói lỏng lẻo). Nó có thể là một tên lớp sai chính tả được cung cấp bởi người dùng của ứng dụng, và do đó có khả năng là một lý do để báo cáo nó cho người dùng và thậm chí có thể thử lại với một tên lớp đã được sửa chữa. Nói cách khác, có thể là lỗi có thể khôi phục được ... trong một số trường hợp ... vì vậy bạn có thể cho rằng quyết định kiểm tra nó là phù hợp.

Dù bằng cách nào:

  • là "đúng đắn" của bất kỳ sự lựa chọn giữa kiểm tra so với kiểm soát là một quan điểm vấn đề, chứ không phải thực tế khách quan,
  • trong quá khứ, các nhà thiết kế Java đã thực hiện các lựa chọn sai lầm trong một số trường hợp và
  • sau khi lựa chọn được thực hiện, không có quay lại ... mà không vi phạm khả năng tương thích ngược.

Ngược lại, nếu bạn gặp sự cố trong quá trình tải/khởi động lớp học, bạn có thể nhận được NoClassDefFoundError. Điều này chắc chắn không thể phục hồi được. Khi điều đó xảy ra, bạn có một hoặc nhiều lớp trong một trạng thái mà chúng tồn tại trong JVM nhưng không thể được khởi tạo hoặc khởi tạo. (Bạn cũng sẽ thấy NoClassDefFoundError nếu JVM không tìm thấy lớp nhập điểm được chỉ định của bạn. Nhưng nếu điều đó xảy ra, ứng dụng của bạn thậm chí sẽ không có cơ hội để khôi phục ...)

+0

IMHO sai lầm lớn nhất đã làm 'SQLException' kiểm tra. – Bohemian

+0

@Bohemian - Xem điểm bullet đầu tiên của tôi :-) –

+0

Tôi sẽ đi ra ngoài một chi và nói rằng đó là một thực tế trong trường hợp này. Khi bạn nhìn vào mã sử dụng JDBC, nó sẽ có các khối try-catch không bao giờ được sử dụng. Không bao giờ. Khi bạn có nhiều mã chiếu lệ, bạn biết bạn đã tạo ra một thiết kế giả mạo. – Bohemian

1

Trường hợp ngoại lệ không được chọn được sử dụng cho các lỗi là chương trình của bạn không thể khôi phục. Ngoại lệ được kiểm tra là dành cho các điều kiện không hợp lệ là bạn có thể khôi phục từ đó.

Và theo như tôi biết khái niệm ngoại lệ đã kiểm tra chỉ tồn tại trong Java.

Bây giờ là câu hỏi mà chương trình có thể phục hồi từ một ClassNotFoundException không?

Điều này được ném hầu hết thời gian theo phương thức Class.forName. Điều này phụ thuộc vào chương trình của bạn và do đó khái niệm kiểm tra và bỏ chọn là một chút ngẫu nhiên, bởi vì nhà phát triển API nên biết liệu chương trình của tôi có thể phục hồi hay không. Khi tôi cần các lớp học trong thời gian chạy và không thể xử lý này sẽ được bỏ chọn cho tôi tuy nhiên khi tôi yêu cầu người dùng cho một cái gì đó và tải một lớp học dựa trên điều này có lẽ đầu vào chỉ là sai và tôi có thể yêu cầu anh ta cho cái gì khác. Nhưng hầu hết thời gian tôi sẽ nói rằng bạn không thể phục hồi từ nó và nó sẽ là tốt hơn để được bỏ chọn.

Tuy nhiên theo quan điểm của tôi, ngoại lệ được kiểm tra được api và bên thứ ba sử dụng để nhắc nhở lập trình viên rằng vấn đề này có thể xảy ra và cần phải suy nghĩ về nó. Và kể từ khi tải một cái gì đó dựa trên một chuỗi thuần túy có thể thất bại và không tương thích với toàn bộ khái niệm ngôn ngữ tĩnh Java gõ ngoại lệ được đánh dấu là kiểm tra, do đó bạn được nhắc nhở rằng bạn tiêu diệt an toàn tĩnh của bạn. Tuy nhiên đây chỉ là ý kiến ​​của tôi.

Cuối cùng quyết định được thực hiện bởi các nhà phát triển của ngoại lệ và ông có thể sai hoặc đúng hoặc có thể nghĩ về một số nguyên nhân khác như I.

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