Я використовую і те, і інше. Я думаю, що вони доповнюють один одного.
Як ви вже говорили, PMD працює над вихідним кодом, і тому виявляє такі проблеми, як: порушення умов іменування, відсутність фігурних дужок, неправильне встановлення нульової перевірки, довгий список параметрів, непотрібний конструктор, відсутність перерви в комутаторі тощо. PMD також розповідає вам про Cyclomatic складність вашого коду, що мені здається дуже корисним (FindBugs не розповідає вам про складність цикломатики).
FindBugs працює над байт- кодом . Ось деякі проблеми FindBugs знаходить, у яких PMD немає: метод equals () не вдається на підтипах, метод клонування може повернути нуль, порівняльне порівняння булевих значень, неможливий викид, 32-бітний int зміщений на величину, що не знаходиться в діапазоні 0-31, колекція, яка містить себе, метод рівних завжди повертає істину, нескінченний цикл тощо.
Зазвичай кожен з них знаходить різний набір проблем. Використовуйте обидва. Ці інструменти мене багато чому навчили писати хороший Java-код.