2009-05-05 41 views
51

Ví dụ, nhiều phương pháp trong khuôn khổ/JDK có thể némCác phương thức có nên ném RuntimeException cho biết nó trong chữ ký phương thức?

java.lang.SecurityException 

nhưng điều này không được nêu trong phương pháp chữ ký (vì đó là một thực hành thông thường dành cho trường hợp ngoại lệ được kiểm tra). Tôi muốn tranh luận rằng việc khai báo RuntimeExceptions trong phương thức sigs có nhiều lợi ích (giống như kiểm tra kiểu tĩnh chẳng hạn). Tôi có say hay không?

Trả lời

42

Tôi sẽ không khai báo ngoại lệ không được kiểm soát trong chữ ký vì nó gây hiểu lầm cho người dùng của API đó. Nó không còn rõ ràng cho dù ngoại lệ phải được xử lý một cách rõ ràng.

Tuyên bố nó trong javadoc là một cách tiếp cận tốt hơn vì nó cho phép ai đó xử lý nếu họ nghĩ rằng nó là cần thiết, nhưng biết rằng họ có thể bỏ qua nó nếu họ muốn. Điều này làm cho sự tách biệt giữa kiểm tra và bỏ chọn rõ ràng.

+1

Trình biên dịch java không ép buộc bạn, xử lý RuntimeExceptions đã khai báo. Vì vậy, bạn có thể tuyên bố chúng, với mục đích là "gợi ý" cho các nhà phát triển. Nó có thể thảo luận được, nếu JavaDoc là một nơi tốt hơn cho điều đó. Điểm về ngoại lệ đã chọn và không được chọn là quan trọng. Các ngoại lệ được kiểm tra và không được kiểm tra là, Java thực sự có nghĩa là gì với (Compiletime-) Exceptions (checked) và RuntimeExceptions (không được kiểm soát). – Guardian667

+2

Vào mùa xuân, việc khai báo các ngoại lệ không được kiểm tra trong chữ ký phương thức bắt đầu là một thực tế phổ biến. – danidacar

4

Theo quan điểm của tôi, tốt hơn hết là khai báo ngoại lệ thời gian chạy ít nhất trong javadoc cho phương thức. Tuyên bố nó trong chữ ký làm cho nó thậm chí còn rõ ràng hơn những gì có thể xảy ra khi một cái gì đó đi sai. Đây là lý do chính của tôi cho việc đề xuất cung cấp thông tin này.

FYI: khi thời gian đã diễn ra (hiện tại vào năm 2017), tôi hiện đang dựa nhiều hơn vào việc ghi lại tài liệu trong javadoc và tránh các ngoại lệ đã kiểm tra càng nhiều càng tốt.

1

Điều này liên quan đến cuộc thảo luận về checked exceptions. Hầu hết sẽ đồng ý rằng các ngoại lệ không nên được khai báo trong các phương thức chữ ký.

Ngoài ra còn có discussion về cách sử dụng ngoại lệ thời gian chạy. Tôi đồng ý với một áp phích rằng các ngoại lệ thời gian chạy phải biểu thị một lỗi lập trình hoặc một tình trạng gây tử vong. Vì vậy, không có nhiều công đức tuyên bố chúng trong chữ ký. Mọi phương pháp đều có khả năng thông qua một phương pháp.

+0

Trường hợp ngoại lệ phân tích cú pháp hoặc một số ngoại lệ loại xác thực dữ liệu khác phù hợp sau đó. Bạn ngụ ý rằng bạn không nên sử dụng các ngoại lệ đã kiểm tra nhưng sau đó giới hạn những ngoại lệ không được kiểm soát có nghĩa là được sử dụng cho. – Robin

+1

Điều tôi đang nói là nhà phát triển không nên bắt buộc phải kiểm tra ngoại lệ. Vì vậy, không cần phải khai báo chúng trong chữ ký phương thức. Trong Java, bạn có thể chuyển đổi chúng trong các ngoại lệ thời gian chạy, như Spring đang làm. Tôi cũng nói rằng ngoại lệ thời gian chạy chỉ nên được ném vào các tình huống không thể phục hồi. – kgiannakakis

3

Trong chế độ xem của tôi, các ngoại lệ không được kiểm soát sẽ không bao giờ được khai báo trong chữ ký phương thức như trái với bản chất của chúng.

Nếu, tuy nhiên, một phương pháp có khả năng ném một số ngoại lệ không được kiểm tra, trong đó có thể có ích cho những người khác gọi phương thức để hiểu những gì có thể xảy ra. Đây là chỉ hữu ích dù cho trường hợp ngoại lệ mà người gọi là khả năng để có thể xử lý (chẳng hạn như một NPE do đầu vào xấu vv)

15

Hãy xem các javadoc cho Bộ sưu tập # thêm

Có một tổng thể các trường hợp ngoại lệ không được kiểm soát được đề cập:

Throws: 
UnsupportedOperationException - add is not supported by this collection. 
ClassCastException - class of the specified element prevents it from being added to this collection. 
NullPointerException - if the specified element is null and this collection does not support null elements. 
IllegalArgumentException - some aspect of this element prevents it from being added to this collection. 

Nếu bạn kiên nhẫn, tôi khuyên bạn nên ghi lại các ngoại lệ có thể có theo phương pháp của bạn theo cách này. Theo một cách nào đó, điều quan trọng hơn là làm điều này cho các trường hợp ngoại lệ không được kiểm tra, vì các ngoại lệ đã kiểm tra có phần tự tạo tài liệu (trình biên dịch buộc mã gọi để xác nhận chúng).

+1

Câu trả lời này là sai. Bạn đang nói về các câu lệnh Javadoc trong khi câu hỏi về 'throws' trong chữ ký phương thức. Đây không phải là điều tương tự. Có, bạn hoàn toàn * nên * ghi lại tất cả các ngoại lệ được API của bạn ném, nhưng câu hỏi không phải là về điều đó. – Gili

3

Nếu bạn đang viết api để người khác sử dụng, thì có nhiều lý do cho tài liệu rõ ràng về ý định của bạn trong api và không có nhược điểm để khai báo RuntimeExceptions trong chữ ký phương thức.

21

Từ the Oracle Java tutorial:

"Nếu nó quá tốt để tài liệu API của phương pháp, trong đó có trường hợp ngoại lệ nó có thể ném, tại sao không ghi rõ trường hợp ngoại lệ thời gian chạy quá?" Thời gian chạy ngoại lệ thể hiện các sự cố là kết quả của vấn đề lập trình và do đó, mã khách hàng API không thể hợp lý được được mong đợi khôi phục từ chúng hoặc xử lý chúng theo bất kỳ cách nào. Các vấn đề như vậy bao gồm các ngoại lệ số học, chẳng hạn như chia cho số không; ngoại lệ con trỏ, chẳng hạn như cố gắng truy cập một đối tượng thông qua tham chiếu null ; và lập chỉ mục ngoại lệ, chẳng hạn như cố truy cập phần tử mảng thông qua chỉ mục quá lớn hoặc quá nhỏ.

Trường hợp ngoại lệ thời gian chạy có thể xảy ra ở bất kỳ đâu trong chương trình và trong một trường hợp điển hình là có thể rất nhiều. Có thêm ngoại lệ thời gian chạy trong mọi tuyên bố phương pháp sẽ làm giảm sự rõ ràng của chương trình.

+0

Vì vậy, trình biên dịch không yêu cầu bạn bắt hoặc chỉ định các ngoại lệ thời gian chạy (mặc dù bạn có thể). – danidacar

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