Jedes Mal, wenn ich, wenn die übergebenen Parameter auf ein Verfahren zu überprüfen, hatte nicht null sind, habe ich eine Null-Scheck zu schreiben und eine IllegalArgumentException
wenn die Nullprüfung nicht werfen:Objects.requireNonNull (T obj) anstelle von Null-Checks und manuell geworfen IllegalArgumentException?
if (user == null) {
throw new IllegalArgumentException("User can't be null.");
}
jedoch durch den Quellcode Lesen von Einige Java 8 Klassen wie ArrayList, ich fand heraus, dass Oracle Objects.requireNonNull verwenden, um einen Parameter gegen einen Nullwert zu überprüfen, und dann, wenn der Test fehlschlägt, wird NullPointerException
geworfen.
Auf diese Weise, die früheren Code-Schnipsel wie dies durch die Annahme dieses Ansatzes aussehen sollen:
Objects.requireNonNull(user, "User can't be null.");
Kleiner und besser lesbar.
Unter der Annahme, dass ich die Kontrolle über die gesamte Ausnahmebehandlung des Systems haben, (auch, dass ich nicht, manchmal ist es Teil des Geschäfts ist es, diese ungeprüften Ausnahmen zu behandeln), sollte ich meine IllegalArgumentExceptions
mit NullPointerException
und Nutzung zu ersetzen Objects.requireNonNull
anstatt meine eigene Nullprüfung und Ausnahmewerfen zu schreiben?
Wir tun dies im JDK für neuen Code und alten Code opportunistisch anzupassen. Und es ist in der Zukunft durchaus möglich, dass die JVM schließlich Objects.requireNonNull ins Leben rufen wird, was ein weiterer Grund ist, sie zu bevorzugen. Die Debatte "sollte ich NPE oder IAE nutzen" ist meist ein Ratschlag; beide Positionen sind vertretbar, und die meiste Anstrengung, die zwischen ihnen verbracht wird, ist verschwendet. –
Wenn Brian Goetz sagt, dass er es in einer Richtung macht, ist es wahrscheinlich so, wie du es willst ;-). – Daniel
@BrianGoetz, auf diese Weise bevorzuge ich die "NullPointerException", wenn diese Nullprüfung fehlschlägt. Joshua hat bereits in seinem Buch die Präferenz für "NPE" gegenüber "IAE" angegeben, und auch wenn ich lese, was Sie über die Zukunft des JDK gesagt haben, denke ich, dass ich genug Beweise dafür habe. By the way, @OSryx answer stills valid um eine andere Art der Parameterprüfung zu implementieren. –