Frage

Welche Art von Nachrichtenvorlage verwenden Sie, wenn Sie Null -Überprüfungen im Java -Code durchführen und IllegalArgumentExceptions für Nullwerte werfen?

Wir neigen dazu, so etwas zu verwenden

public User getUser(String username){
   if (username == null){
     throw new IllegalArgumentException("username is null");   
   }
   // ...
}

Was ist besser: "Ist Null" oder "war Null" und warum?

Für mich fühlt sich "ist null" natürlicher.

War es hilfreich?

Lösung

Seit der Exception wird aufgrund einer fehlgeschlagenen Voraussetzungsprüfung geworfen, denke ich, anstatt einfach nur eine Tatsache zu sagen, dass Sie das angeben sollten Erfordernis Das wurde verletzt.

Das heißt, anstatt zu sagen "username is null", sagen "username should not be null".


Bei der Verwendung von Bibliotheken für Voraussetzungsprüfungen

Als Tipp können Sie eine der vielen Bibliotheken verwenden, die zur Erleichterung von Voraussetzungen überprüft werden. Viele Code in Guava verwendet com.google.common.base.Preconditions

Einfache statische Methoden, die zu Beginn Ihrer eigenen Methoden aufgerufen werden sollen, um korrekte Argumente und Status zu überprüfen. Dies ermöglicht Konstrukte wie z.

 if (count <= 0) {
   throw new IllegalArgumentException("must be positive: " + count);
 }

durch das kompaktere ersetzt werden

 checkArgument(count > 0, "must be positive: %s", count);

Direkter relevanter ist hier, dass es hat, dass es hat checkNotNull, was es Ihnen ermöglicht, einfach zu schreiben:

  checkNotNull(username, "username should not be null");

Beachten Erfordernis Das wurde verletzt.

Die Alternative zur Angabe von Fakten ist unangenehmer:

 // Awkward!
 checkArgument(count > 0, "is negative or zero: %s", count);
 checkNotNull(username, "username is null");

Darüber hinaus ist dies auch möglicherweise weniger nützlich, da der Kunde möglicherweise bereits über die Tatsache informiert ist, und die Ausnahme hilft ihnen nicht, herauszufinden, was die tatsächlichen Bedarf sind.


An IllegalArgumentException vs NullPointerException

Während Ihr ursprünglicher Code wirft IllegalArgumentException an null Argumente, Guavas Preconditions.checkNotNull Würfe NullPointerException stattdessen.

Dies entspricht der von der API festgelegten Richtlinie:

NullPointerException: Anwendungen sollten Instanzen dieser Klasse werfen, um andere illegale Verwendungen der null Objekt.

Zusätzlich hier ist ein Zitat von Effektive Java 2. Ausgabe: Artikel 60: Bevorzugung der Verwendung von Standardausnahmen:

Möglicherweise sind alle fehlerhaften Methodenaufrufe auf ein illegales Argument oder einen illegalen Zustand zurückzuführen, aber andere Ausnahmen werden standardmäßig für verwendet bestimmte Arten von illegalen Argumenten und Staaten. Wenn ein Anrufer passiert null In einigen Parametern, für die Nullwerte verboten sind, bestimmt die Konvention dies NullPointerException geworfen werden und nicht IllegalArgumentException.

Andere Tipps

ist Null, da das Argument immer noch null ist ..

Warum aber nicht einfach eine NullPointerexception ohne Nachricht werfen?

Ich würde vorschlagen, sagen

  if (userName == null) {
     throw new IllegalArgumentException("username == null");
   }

da dies so tödlich ist, dass ein Programmierer es trotzdem betrachten muss. Das übereinstimmende Code -Snippet in der Ausnahmebeldung zu verweisen, ist das Concistest, was ich mir vorstellen kann.

Ich würde dazu neigen, dies zu schreiben:

public User getUser(String username) {
   if (username.length() == 0) {
       throw new IllegalArgumentException("username is empty");   
   }
   // ...
}

Dies tötet zwei Vögel mit einem Stein. Zunächst erkennt es den Fall, in dem der Benutzername eine leere Zeichenfolge ist, die (aus Gründen der Argumentation) annehme, dass ich ein Fehler ist. Zweitens, wenn der Parameter ist null Versuch, die zu versenden length Anruf wird a geben NullPointerException.

Für die Aufzeichnung die erwartet Ausnahme für ein unerwartetes Wurf null ist NullPointerException. Wenn Ihr Hauptgrund für die Nichtverwendung darin besteht, dass die NPEs normalerweise keine Nachricht haben, codieren Sie sie so:

public User getUser(String username){
   if (username == null){
       throw new NullPointerException("username is null");   
   }
   if (username.length() == 0) {
       throw new IllegalArgumentException("username is empty");   
   }
   // ...
}

Warum NPE hier verwenden? Weil NPE fast immer a angibt a unterschiedliche Art von Problem zu einem anderen Arten von Argument -Validierungsfehler; zB ein Feld oder eine Array -Zelle, die nicht initialisiert wurde, oder ein "optionaler" Wert, der nicht ordnungsgemäß gehandhabt wird.

Zum Schluss zur Frage:

Was ist besser : "is null" oder "was null", und warum?

Dies ist eine Frage der Meinung, aber ich würde schreiben "is null".

  • Weil die Nachricht den Zustand meldet, als die Ausnahme ausgelöst wurde.
  • Weil es konventionell ist, es so zu tun.
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top