Estoy usando ambos. Creo que se complementan.
Como dijiste, PMD funciona en el código fuente y, por lo tanto, encuentra problemas como: violación de las convenciones de nomenclatura, falta de llaves, verificación nula mal colocada, lista de parámetros larga, constructor innecesario, interrupción faltante en el interruptor, etc. PMD también te informa sobre Cyclomatic complejidad de su código que encuentro muy útil (FindBugs no le informa acerca de la complejidad ciclomática).
FindBugs funciona en . Estos son algunos problemas que FindBugs encuentra que PMD no detecta: el método equals () falla en los subtipos, el método clon puede devolver un valor nulo, comparación de referencia de valores booleanos, conversión imposible, int de 32 bits desplazado por una cantidad que no está en el rango de 0-31, una colección que se contiene a sí misma, método equals siempre devuelve verdadero, un bucle infinito, etc.
Por lo general, cada uno de ellos encuentra un conjunto diferente de problemas. Utilice ambos. Estas herramientas me enseñaron mucho sobre cómo escribir un buen código Java.