2015-07-01 21 views
6

Tôi muốn chính thức chú thích chữ ký chức năng của mình để làm rõ các hợp đồng của họ - đặc biệt nếu null thông số và giá trị trả lại được phép hoặc bị cấm — theo cách FindBugs ' công cụ phân tích mã tĩnh (và có thể khác) có thể tận dụng nó.Cách sử dụng các chú thích @CheckForNull, @Nonnull và @Nullable của FindBugs chính xác

Có hai gói (annotations.jarjsr305.jar) với bốn chú thích để đạt được điều này, cũng như tùy chọn không đặt chú thích.

+1

Đó sẽ là '@ Nonnull', không phải' @ NotNull' – fge

+0

Tôi đã thay đổi nó. Cảm ơn. – Paramaeleon

Trả lời

6

Đây là những phát hiện của tôi sau một cố gắng xung quanh:

thông số Phương pháp:

  • Parameter không phải null: Đừng đặt bất kỳ chú thích. Trong trường hợp này, một điểm đánh dấu lỗi xuất hiện nếu null được chuyển đến phương thức. (Tôi đã mong đợi hành vi này khi đặt chú thích @Nonnull, nhưng khi tôi đặt nó, không có điểm đánh dấu lỗi nào xuất hiện.)
  • Tham số có thể là null: Đặt chú thích @Nullable. . (Cùng hiệu lực đối với @CheckForNull Các @Nullabledocumentation lần đọc: “FindBugs sẽ đối xử với các mục chú thích như thể họ không có chú thích.” Điều này không đúng Nếu tôi gọi string.length()String string đã được đánh dấu @Nullable, nó gây ra một dấu hiệu lỗi xuất hiện. , nếu không có chú thích không đánh dấu lỗi cho thấy) giá trị trả về

Phương pháp:.

  • Phương pháp không bao giờ trở về null: Đặt @Nonnull. Gây ra điểm đánh dấu lỗi nếu bạn cố gắng return null; từ bên trong phương thức.
  • Phương thức có thể trả lại null: Bạn có muốn thực thi séc không? Kiểm tra có thể là một chi phí nếu giá trị trả về chỉ phụ thuộc vào tham số của phương thức mà có thể giả định được gọi vào thời gian gọi, như “phương thức của tôi trả về null nếu tham số là số âm”. Tôi sẽ không đặt chú thích trong trường hợp đó. Tuy nhiên, bạn có thể cân nhắc việc ném một số IllegalArgumentException thay vì trả lại null.
  • Phương thức có thể trả lại null và đối tượng trả về phải luôn được kiểm tra: Đặt @CheckForNull. Tuy nhiên, trong nhiều trường hợp có những cách tốt hơn để đi, bạn có thể cân nhắc việc trả lại Collections.emptyList() thay vì null danh sách hoặc ném MissingResourceException, IOException hoặc một ngoại lệ thích hợp khác.

Những tập tin JAR để sử dụng:

  • Cả hai tập tin jar gây ra hành vi tương tự của FindBugs, sự khác biệt duy nhất là các chú thích từ annotations.jar được hiển thị như bị phản đối trong Eclipse. Vì vậy, hãy sử dụng jsr305.jar.
  • Tệp jar là cần thiết. Tạo chú thích trống với gói và tên lớp đã cho không hoạt động. Bạn có thể get it here.
3

@Paramaeleon đã đưa ra một số mẹo tuyệt vời, chẳng hạn như cách bạn phải để lại tham số phương pháp không được báo trước vì FindBugs vô tình chặn tất cả cảnh báo nếu bạn viết @Nonnull.

Nếu bạn sẵn sàng thử một công cụ phân tích tĩnh khác, bạn có thể xem xét Nullness Checker của Checker Framework.

Sự khác biệt chính là Trình kiểm tra Nullness nhằm phát hiện tất cả các lỗi con trỏ null. Ngược lại, FindBugs cố tình không báo cáo một số lỗi có thể xảy ra cho bạn, để báo cáo ít cảnh báo sai tích cực hơn. Cả hai công cụ này đều cho kết quả tốt hơn, bạn càng viết nhiều chú thích. Nếu bạn không sẵn sàng viết bất kỳ chú thích nào, thì FindBugs là một công cụ thích hợp hơn. Nếu bạn sẵn sàng viết chú thích, thì Khung kiểm tra có thể tốt hơn.

Hướng dẫn Kiểm tra Nullness chứa nhiều so sánh hơn trong phần của nó về choosing a nullness analysis tool.

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