Null-Check trotz try-catch-Block (Java, Programmierstil)?

Das Ergebnis basiert auf 5 Abstimmungen

Ignorieren 60%
Null-Checks 40%

6 Antworten

Vom Fragesteller als hilfreich ausgezeichnet
Ich frage mich jetzt, ob man das so lässt und die Warnung einfach ignoriert, oder soll ich jetzt an einigen Stellen immer prüfen, ob etwas null oder empty ist, obwohl ich dann sowieso selbst nichts mache als in den finally-Block zu gehen und die Fehlermeldung zu schmeißen?

Vor allem solltest du nicht einfach alle Exceptons einfangen, sondern jeweils die erwartbaren aufschlüsseln.

Aber auch ansonsten ist es gut, explizit auf null zu prüfen, statt einfach danach die Exception aufzufangen, außer das würde sich gut einbauen (da sowieso ein Haufen Exceptions zu erwarten wären), dann sollte das aber mit einem Kommentar angemerkt werden.

Das Prüfen auf != null kannst du oft in Asserts packen.

schnfz  25.07.2022, 13:15
Das Prüfen auf != null kannst du oft in Asserts packen.

Die in produktivem Code eher nichts verloren haben und ohne -enableassertions auch von der JVM ignoriert werden.

Ein benutzerfreundliches API sollte - wenn es überhaupt nulls zurückgeben muss, weil Exceptions unpassend sind - Optionals zurückgeben, dann kann man vernünftig damit umgehen.

3
Destranix  25.07.2022, 13:19
@schnfz
Die in produktivem Code eher nichts verloren haben und ohne -enableassertions auch von der JVM ignoriert werden.

Im Debugmodus werden die ausgeführt, in der fertigen version nicht. Und doch klar packt man soetwas auch in produktiven Code!

Ein benutzerfreundliches API sollte - wenn es überhaupt nulls zurückgeben muss, weil Exceptions unpassend sind - Optionals zurückgeben, dann kann man vernünftig damit umgehen.

Wäre womöglich toll. Ich kann mich allerdings nicht erinnern das jemals bei einem API gesehen zu haben.

1
schnfz  25.07.2022, 13:22
@Destranix

Stimmt,da habe ich mich schlecht ausgedrückt - sie sind im Sourcecode, aber in Produktion zur Laufzeit eben wirkungslos. Wenn ich mich dann aber darauf verlasse, erlebe ich eine Überraschung…

2
Destranix  25.07.2022, 13:24
@schnfz

Korrekt! Wenn man zur Laufzeit einen Null-Check braucht, dann sollte man diesen entsprechend auch implementieren.

3
Null-Checks
catch(Exception e)

ist eher schlechter Stil, du solltest (in der Regel) gezielt die Exception Typen handeln die du erwartest und nicht einfach alle.

Wenn null ein erwarteter Rückgabewert ist, dann sollte man darauf prüfen und nicht das Exception Handling dafür missbrauchen. Exceptions sind für Dinge die eigentlich nicht passieren sollten. Was ich merkwürdig finde ist warum so was wie getFarbe null zurück geben sollte, warum sollte ein Auto keine Farbe haben? Cursed.

Wenn die API eigener Code ist müsstest du dich eventuell entscheiden ob null zurück geben richtig ist oder du lieber direkt dort eine Exception werfen möchtest. Aber meiner Meinung nach wäre eine Exception eben angebracht wenn es auch wirklich ein Fehler ist, egal wo jetzt genau.

So oder so ist null unschön. Ich mache kein Java mehr aber bin generell Fan von so was: https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html

Woher ich das weiß:Berufserfahrung – Software Entwickler / Devops

Muss kein null Check hin. Aber vermutlich kann api.get auch eine exception werfen? Sollte vermutlich auch in einen try Catch block.

paulfragtgf 
Fragesteller
 25.07.2022, 12:54

Ups, ja, steht in meinem Code auch so. Hab ich dummerweise in der Frage falsch gehabt. Hab ich korrigiert. Danke!

0

Statt eine allgemeine Exception zu fangen, kannst du auch gezielt Nullpointer catchen und damit umgehen.

catch (NullPointerException npe) {
  ...
}
BooWseR  25.07.2022, 12:50

Oder du prüfst ob bmw überhaupt existiert, bevor du die Funktion "getFarbe()" oder "toString()" ausführst.

0
paulfragtgf 
Fragesteller
 25.07.2022, 12:52
@BooWseR

Das ist ja meine Frage. Sollte ich vor dem Zugriff jedes Mal noch prüfen ob null/empty, oder sage ich: Ich spare mir diesen Code und Rechenaufwand, denn wenn eine NullPointerException auftritt, wird sie sowieso gefangen?

Ich stelle mir lediglich die Frage nach dem besseren Stil. Wie geht man damit um?

0
BooWseR  25.07.2022, 12:55
@paulfragtgf

Also was man machen sollte ist gezielt Exceptions abfangen, wie eben catch (NullPointerException ...)
So kannst du gezielter mit verschiedenen Fehlern umgehen.
Ich würde wohl vorher prüfen ob es eine Farbe gibt, kommt aber ein bisschen auf die Gesamtheit des Codes an.
Ist die Farbe nämlich leer, brauchst du den Rest der Methode auch nicht ausführen, sofern sich die Methode nur um die Farbe dreht.
Also einfach ein Return if not bmw.

0

Das kommt ganz drauf an was Null in dem Sinne hier bedeutet.

Exceptions sind Fehlerbehebungsstrategien sollten aber niemals zum Programmfluss gehören. Also wenn es sein kann, dass bmw und der Returnvalue von GetFarbe Null sein können und das in dem Sinne keinen Fehler sondern nur Fehlende Information darstellt, dann sollte das nicht mit einer Exception abgefangen werden.

Also Exceptions sind für den Fall, dass etwas so schief geht, dass dieser Prozess abgebrochen werden muss, oder wenn irgendwo extern ein Fehler vorliegt, sie sollten aber nicht dafür genutzt werden einfach nur bestimmte Fälle abzufangen welche auch bei einem funktionierenden Programm auftreten können.