Null- oder IllegalArgumentException

  • Themenstarter Themenstarter Beni
  • Beginndatum Beginndatum

Was für eine Exception ist angebracht?

  • IllegalArgumentException

    Stimmen: 0 0,0%
  • BeniIstDoofException

    Stimmen: 0 0,0%

  • Anzahl der Umfrageteilnehmer
    215
Status
Nicht offen für weitere Antworten.
B

Beni

Gast
Ich sitze gerade vor einem mächtigen Problem: eine Methode bekommt ein Argument, nennen wir es x.
x darf nicht null sein.
Wenn nun diese Methode ein x = null bekommt, welche Exception soll sie da werfen? NullPointer oder IllegalArgument?
 
Bin für IllegalArgumentException weil es ja primär um das übergebene Argument geht.
Du könntest doch aber in einem zweiten catch-Block trotzdem noch eine NullPointerException abfangen.
 
Ich denke hier ist beides gleich gut.

Einerseits ist es so, dass es ungültiges Argument übergeben wurde, jedoch ist es auf der anderen Seite so, dass Du null übergeben bekommst und dies im weiterem Programmverlauf ein Fehler darstellt.
 
Naja, ich denke trotzdem, dass du gleich das illegale Argument abfangen solltest, denn warum sollte man im weiteren Programmverlauf mit Dingen arbeiten, die Probleme verursachen können. Wenn du gleich die IllegalArgumentException auffängst, gehst du dem schon von Anfang an aus dem Weg.
 
Hm, meine Gedanken gingen in eine ähnliche Richtung wie L-ectron-X'ses.

Dann nehm ich mal die IllegalArgument.

THX für das Schreiben & Denken.
 
ich wollte gerade dasselbe fragen und bin über die suche auf diesen thread gestoßen. da dieser schon 2 jahre alt ist, gibts ja vielleicht ein paar neue meinungen dazu.
 
die Exception soll doch sicherlich am Start eigenständig geworfen werden,
da passt nur IllegalArgumentException,
throw NullPointerException führt in die Irre, da ja kein fehlerhafter Zugriff auftrat

NullPointerException ist für mich eine Systemexception,
die idealerweise überhaupt nur bei null.operation() auftritt
 
SlaterB hat gesagt.:
NullPointerException ist für mich eine Systemexception,
die idealerweise überhaupt nur bei null.operation() auftritt

ich sehs eigentlich eh auch so. wie man am umfrageergebnis sieht, ists aber nicht so eindeutig.

bei mir wird ansonsten eine NPE aber auch nur bei aufrufen à la null.operation() geworfen, da ich ja mitten in einer methode nicht auf null-überprüfe, außer eine methode kann null returnieren, aber dann muss ich diesen fall ja entsprechend behandlen und es macht wohl wenig sinn, selbst eine NPE zu werfen.
 
stimme SlaterB zu...

NullPointer halte ich fuer unangebracht in diesem Fall !
 
die guten NPE's lernt man mit der zeit eh lieben, also nimm diese 😉

#edit 1:
oder schreibst ne eigene IllegalArgumentBecauseItIsNullException und wirfst die
 
Ich finde die NullPointerException schon deshalb unangebracht, weil sie suggeriert, dass das Objekt, dessen Eigenschaften und Methoden aufgerufen werden sollen, null ist. Das führt in dem Kontext nur zu Verwirrung.

[EDIT]:
Upps,sollte man den ganzen Thread VORHER lesen, Slater hat ja schon sinngemäß das Gleiche geschrieben...
 
Ich persönlich werfe nie, also nie absichtlich, NPEs. Der Grund ist einfach: Ich will keine NPEs fangen weil diese andere Programmierfehler verschlucken könnten. Für mich sind NPEs echten Programmierfehlern vorbehalten. Vergesse ich einen Wert gegen null zu testen gibt es eine NPE - vergesse ich es nicht aber der Wert darf nicht null sein gibt es eine IllegalArgumentException (o.Ä.). Die IAE kann ich fangen - verschlucke dabei aber keine anderen Programmierfehler.

Dadurch kann ich mir bei meinem eigenen Code immer sicher sein das ich einen Programmierfehler habe wenn er eine NPE wirft.

MfG,
Hilefoks
 
Also ich denke es sprichts nichts dagegen eine NPE zu werfen.
Denn entweder sind null Parameter erlaubt, oder es wird spaeter doch eh eine NPE geworfen.
also als Beispiel:
Code:
void machWas(Object foo)
{
    if ( foo.equels ) // mache irgendwas
}
Nun wirft der Programmierer keine NPE, aber die wird dann eh spaeter bei der If-Abfrage geworfen.
Code:
void machWas(Object foo)
{
    if ( foo == null ) throw new NPE("Param foo is null");
    if ( foo.equels ) // mache irgendwas
}
So kann man gleich sehen, dass foo nicht null sein darf.

Nehmen wir doch mal einen komplizierten Fall:
Code:
void machWas(Object foo)
{
    meineListe.add(foo);
}

// irgendwo spaeter
void macheBar()
{
    foreach ( meineListe : item ) item.machWas();
}
Nun wird eine NPE geworfen, aber wer weis noch, woher das null-Objekt hergekommen ist?

Code:
void machWas(Object foo)
{
    if ( foo == null ) throw new NPE("Param foo is null");
    meineListe.add(foo);
}

// irgendwo spaeter
void macheBar()
{
    foreach ( meineListe : item ) item.machWas();
}
Aha, hier weis ich sofort, dass foo nicht null sein darf, weil es dann spaeter im Programm einen Fehler gibt.

Also meine Schlussfolgerung: Dem werfen einer NPE steht eigentlich nichts im Wege. Aber es gilt die Regel: Fehler immer so frueh wie moeglich zu erkennen und mit Exceptions um sich werfen. Denn je laenger man damit wartet, desto schwieriger wird es den Fehler nachzu vollziehen.
Ausserdem, eine NPE faengt man normalerweise auch nicht explizit (also man macht doch kein try catch fuer eine NPE).
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben