46 Stimmen

Was sind die am häufigsten verwendeten Laufzeitausnahmen in Java?

Als Java-Programmierer, der seine Programmierfähigkeiten perfektionieren möchte, komme ich oft in Situationen, in denen ich eine Laufzeitausnahme erstellen muss. Ich weiß, dass es eine gute Praxis ist, wenn man sie mit Bedacht einsetzt.

Persönlich, NullPointerException y IllegalStateException werden am häufigsten in den von mir entwickelten Programmen verwendet. Wie sieht es bei Ihnen aus?

Welche Laufzeitausnahmen verwenden Sie häufig? In welchen Situationen verwenden Sie sie?

68voto

KLE Punkte 22895

Ich werfe nie NullPointerException . Für mich ist es eine, die ganz natürlich im Code auftaucht, wenn etwas schief geht, und die einen Entwickler dazu zwingt, sich anzusehen, was passiert. Dann behebt er die Ursache und das Problem tritt nicht mehr auf.

Ich benutze IllegalStateException um zu signalisieren, dass ein Objekt falsch konfiguriert ist oder dass die Reihenfolge der Aufrufe nicht stimmt. Wir alle wissen jedoch, dass ein Objekt idealerweise sicherstellen sollte, dass es sich nicht in einem schlechten Zustand befinden kann und dass man es nicht in falscher Reihenfolge aufrufen kann (einen Builder und ein daraus resultierendes Objekt erstellen ...).

Ich verwende eine Menge IllegalArgumentException wenn eine Methode feststellt, dass ihre Parameter falsch sind. Dies ist die Aufgabe jeder öffentlichen Methode, die Verarbeitung abzubrechen (um indirekte Fehler zu vermeiden, die schwieriger zu verstehen sind). Außerdem gibt es einige if s am Anfang einer Methode dienen der Dokumentation (Dokumentation, die nie vom Code abweicht, weil es der Code ist :-) ).

     public void myMethod(String message, Long id) {
       if (message == null) {
          throw new IllegalArgumentException("myMethod's message can't be null");
          // The message doesn't log the argument because we know its value, it is null.
       }
       if (id == null) {
          throw new IllegalArgumentException("myMethod's id can't be null");
          // This case is separated from the previous one for two reasons :
          // 1. to output a precise message
          // 2. to document clearly in the code the requirements
       }
       if (message.length()<12) {
          throw new IllegalArgumentException("myMethod's message is too small, was '" + message + "'");
          // here, we need to output the message itself, 
          // because it is a useful debug information.
       }
     }

Ich verwende auch spezifische Laufzeitausnahmen um außergewöhnliche Bedingungen auf höherer Ebene zu signalisieren.

Wenn zum Beispiel ein Modul meiner Anwendung nicht gestartet werden kann, könnte ich eine ModuleNotOperationalException (idealerweise durch einen generischen Code wie einen Interceptor, andernfalls durch einen spezifischen Code), wenn ein anderes Modul es aufruft. Nach dieser architektonischen Entscheidung muss jedes Modul mit dieser Ausnahme bei Operationen umgehen, die andere Module aufrufen...

12voto

Andrzej Doyle Punkte 99892

Ich war immer der Ansicht, dass Laufzeitausnahmen Programmierfehler darstellen sollten (z. B. null Referenz übergeben, die nicht erwartet wird, Array-Index außerhalb der Grenzen, usw.), während geprüfte Ausnahmen außergewöhnliche Bedingungen in der Umgebung darstellen sollten, die nicht "weggekodiert" werden können (z.B. IOException , SQLException ).

Ein Verstoß hiergegen ist, dass man manchmal etwas, das eigentlich eine geprüfte Ausnahme sein sollte, in eine RuntimeException verpacken muss, um die Definition einer Schnittstelle zu erfüllen. Ein kurzes Beispiel: Sie haben vielleicht eine schicke Implementierung von java.util.List die eine verteilte Liste zwischen mehreren Rechnern verwaltet. Dies würde natürlich geprüfte Ausnahmen auslösen (wahrscheinlich eine Unterklasse von IOException ), wenn sie selbst definiert ist, aber die Vorteile der Implementierung dieser Klasse List ist, dass die Kunden sie fast überall dort verwenden können, wo sie eine andere Liste verwenden.

Dies kann zu dem führen, was Joel als eine undichte Abstraktion Daher ist es wichtig, dass die Dokumentation klar definiert, welche Ausnahmen ausgelöst werden können und was sie bedeuten! In diesem Fall finde ich eine eigene Unterklasse von RuntimeException um im Allgemeinen die Grundursache klarer zu kommunizieren, anstatt zu versuchen, sie in eine bestehende Laufzeit-Ausnahmeklasse zu pressen.

3voto

NawaMan Punkte 24275

Ich benutze IllegalArgumentException relativ häufig. Meistens versuche ich, den Standardwert wiederherzustellen, sobald es logisch ist, aber manchmal ist das nicht der Fall, und dann verwende ich diesen.

Eine andere, die ich verwende, ist ArrayIndexOutOfBoundsException .

3voto

IAdapter Punkte 58848

UnknownException, sehr nützlich :P

Ich mag auch org.apache.commons.lang.NotImplementedException

3voto

vinS Punkte 1397

Nach Angaben von Joshua Bloch en Leistungsfähiges Java ,

Die am häufigsten wiederverwendeten Ausnahmen:

  1. IllegalArgumentException
  2. IllegalStateException
  3. NullPointerException
  4. IndexOutOfBoundsException
  5. ConcurrentModificationException
  6. UnsupportedOperationException

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X