Tôi đang sử dụng cả hai. Tôi nghĩ chúng bổ sung cho nhau.
Như bạn đã nói, PMD hoạt động trên mã nguồn và do đó phát hiện các vấn đề như: vi phạm quy ước đặt tên, thiếu dấu ngoặc nhọn, kiểm tra null đặt sai vị trí, danh sách tham số dài, hàm tạo không cần thiết, thiếu ngắt trong công tắc, v.v. PMD cũng cho bạn biết về Cyclomatic độ phức tạp của mã của bạn mà tôi thấy rất hữu ích (FindBugs không cho bạn biết về độ phức tạp Cyclomatic).
FindBugs hoạt động trên bytecode. Dưới đây là một số vấn đề FindBugs tìm thấy PMD nào không: phương thức equals () không thành công trên các kiểu con, phương thức nhân bản có thể trả về null, so sánh tham chiếu các giá trị Boolean, không thể ép kiểu, 32 bit int bị dịch chuyển bởi một số lượng không nằm trong phạm vi 0-31, một tập hợp chứa chính nó, phương thức bằng luôn trả về true, một vòng lặp vô hạn, v.v.
Thông thường mỗi người trong số họ tìm thấy một loạt vấn đề khác nhau. Sử dụng cả hai. Những công cụ này đã dạy tôi rất nhiều về cách viết mã Java tốt.