Saya menggunakan keduanya. Saya pikir mereka saling melengkapi.
Seperti yang Anda katakan, PMD bekerja pada kode sumber dan oleh karena itu menemukan masalah seperti: pelanggaran konvensi penamaan, kurangnya kurung kurawal, pemeriksaan null yang salah tempat, daftar parameter yang panjang, konstruktor yang tidak perlu, tombol putus yang hilang, dll. PMD juga memberi tahu Anda tentang Cyclomatic kompleksitas kode Anda yang menurut saya sangat membantu (FindBugs tidak memberi tahu Anda tentang kompleksitas Cyclomatic).
FindBugs bekerja dengan bytecode. Berikut adalah beberapa masalah yang ditemukan oleh FindBugs yang tidak dilakukan PMD: metode equals () gagal pada subtipe, metode klon dapat mengembalikan null, perbandingan referensi nilai Boolean, cast tidak mungkin, int 32bit digeser dengan jumlah yang tidak dalam kisaran 0-31, koleksi yang berisi dirinya sendiri, metode yang sama selalu mengembalikan nilai true, loop tak terbatas, dll.
Biasanya masing-masing menemukan serangkaian masalah yang berbeda. Gunakan keduanya. Alat-alat ini mengajari saya banyak hal tentang cara menulis kode Java yang baik.