mein Senf dazu (Achtung: nicht wirklich ausgereift, und auch die Java-API ist teilweise nicht ganz konsistent):
* RuntimeException (müssen NICHT mit try-catch-finally behandelt werden) nur dann verwenden, wenn sich der Aufrufer auf keinen Fall von der "Fehler Situation" erholen kann, also wird ggf. Absturz der JVM entstehen.
vor allem innerhalb eines Pakets (bei "package scope" Methoden) zusammen mit asserts verwenden, um Programmierfehler zu finden
WICHTIG: In die Doku damit!
* Exception (müssen mit try-catch-finally "abgefangen" werden)
Immer dann, wenn sich der Aufrufer irgendwie doch erholen kann, also etwas gegen den Fehler tun kann/muss
Oft selber schreiben, damit der Aufrufer genau weiss, was schief gegangen ist
vor allem bei Public Methoden, die von anderen Proggern aufgerufen werden und die eventuell "ungültige und falsche" Parameter übergeben
Merkregel: eine Nullpointerexception aktiv (mit throw) in einer public methode zu werfen ist völliger Unsinn; kein externer Programmierer würde sie jemals abfangen...