it-swarm.com.de

Beste Möglichkeit, in Java nach Nullwerten zu suchen?

Vor dem Aufruf einer Funktion eines Objekts muss ich überprüfen, ob das Objekt null ist, um zu vermeiden, dass ein NullPointerException ausgelöst wird.

Wie gehen Sie am besten vor? Ich habe diese Methoden in Betracht gezogen. 
Welches ist die beste Programmiermethode für Java?

// Method 1
if (foo != null) {
    if (foo.bar()) {
        etc...
    }
}

// Method 2
if (foo != null ? foo.bar() : false) {
    etc...
}

// Method 3
try {
    if (foo.bar()) {
        etc...
    }
} catch (NullPointerException e) {
}

// Method 4 -- Would this work, or would it still call foo.bar()?
if (foo != null && foo.bar()) {
    etc...
}
27
Arty-fishL

Methode 4 ist am besten.

if(foo != null && foo.bar()) {
   someStuff();
}

verwendet Kurzschlussauswertung , dh es endet, wenn die erste Bedingung eines logical AND falsch ist.

56
Jared Nielsen

Der letzte und der beste. d. LOGICAL AND

  if (foo != null && foo.bar()) {
    etc...
}

Weil in logischem && 

es ist nicht notwendig zu wissen, was die rechte Seite ist, das Ergebnis muss falsch sein 

Lieber lesen: Java-Kurzschluss des logischen Operators

11
Suresh Atta

In Java 8 können Sie am besten auf null prüfen:

Objects.isNull(obj) //returns true if the object is null

Objects.nonNull(obj) //returns true if object is not-null

if(Objects.nonNull(foo) && foo.something()) // Uses short-circuit as well. No Null-pointer Exceptions are thrown.

Abgesehen davon ... Sie können auch die optionale Klasse von Guava wählen

Reduziert typologische Fehler wie (obj=null), die immer true zurückgibt, wie in den vorherigen Antworten erläutert.

7
Mohamed Anees A
  • NullPointerException nicht abfangen. Das ist eine schlechte Praxis. Es ist besser sicherzustellen, dass der Wert nicht null ist.
  • Methode 4 wird für Sie arbeiten. Die zweite Bedingung wird nicht bewertet, da Java einen Kurzschluss aufweist (d. H., Nachfolgende Bedingungen werden nicht ausgewertet, wenn sie das Endergebnis des booleschen Ausdrucks nicht ändern). In diesem Fall müssen nachfolgende Ausdrücke nicht ausgewertet werden, wenn der erste Ausdruck eines logischen UND als falsch ausgewertet wird.
5
Vivin Paliath

Methode 4 ist bei weitem die beste, da sie eindeutig zeigt, was passieren wird und nur ein Minimum an Code benötigt.

Methode 3 ist auf jeder Ebene einfach falsch. Sie wissen, dass der Artikel möglicherweise null ist. Es ist also keine Ausnahmesituation, auf die Sie prüfen sollten.

Methode 2 macht es nur komplizierter, als es sein muss.

Methode 1 ist nur Methode 4 mit einer zusätzlichen Codezeile.

4
wobblycogs

Ich würde sagen, dass Methode 4 die allgemeinste Redewendung aus dem Code ist, den ich mir angesehen habe. Aber das kommt mir immer ein bisschen übelriechend vor. Es wird davon ausgegangen, dass foo == null mit foo.bar () == false identisch ist. 

Das fühlt sich für mich nicht immer richtig an.

2
DaveH

Methode 4 ist meine bevorzugte Methode. Der Kurzschluss des &&-Operators macht den Code am lesbarsten. Methode 3, NullPointerException abfangen, wird meistens missbilligt, wenn eine einfache Nullprüfung ausreicht.

2
aglassman

In Java 7 können Sie Objects.requireNonNull()..__ verwenden. Fügen Sie einen Import der Objects-Klasse aus Java.util hinzu.

public class FooClass {
    //...
    public void acceptFoo(Foo obj) {
        //If obj is null, NPE is thrown
        Objects.requireNonNull(obj).bar(); //or better requireNonNull(obj, "obj is null");
    }
    //...
}
2
KrishPrabakar

Wie andere bereits gesagt haben, ist # 4 die beste Methode, wenn keine Bibliotheksmethode verwendet wird. Sie sollten jedoch immer auf der linken Seite des Vergleichs null angeben, um sicherzustellen, dass Sie foo im Fall eines Tippfehlers nicht versehentlich null zuweisen. In diesem Fall wird der Compiler den Fehler feststellen.

// You meant to do this
if(foo != null){

// But you made a typo like this which will always evaluate to true
if(foo = null)

// Do the comparison in this way
if(null != foo)

// So if you make the mistake in this way the compiler will catch it
if(null = foo){

// obviously the typo is less obvious when doing an equality comparison but it's a good habit either way
if(foo == null){
if(foo =  null){
1
Jay Eskandarian

Sie können auch StringUtils.isNoneEmpty("") verwenden, damit die Prüfung null oder leer ist.

1
Durgpal Singh

Wenn Sie die aufgerufene API steuern, sollten Sie die Option Guava Optionale Klasse verwenden.

Mehr Infos hier . Ändern Sie Ihre Methode, um einen Optional<Boolean> anstelle einer Boolean zurückzugeben.

Dadurch wird der aufrufende Code darüber informiert, dass er die Möglichkeit der Null berücksichtigen muss, indem er eine der praktischen Methoden in Optional aufruft.

1
Sam Barnum

Wenn Sie mit double gleich "==" prüfen, überprüfen Sie null mit object ref like 

if(null == obj) 

anstatt 

if(obj == null)

denn wenn Sie single als if falsch eingeben (obj = null), wird true zurückgegeben (das Zuweisen eines Objekts gibt den Erfolg zurück (was im Wert 'true' ist).

1
user3107979

wenn Sie keinen Zugriff auf die allgemeine Apache-Bibliothek haben, wird das Folgende wahrscheinlich funktionieren

if(null != foo && foo.bar()) {
//do something
}
0
Cyril Deba

Einfacher einzeiliger Code zum Überprüfen auf null

namVar == null ? codTdoForNul() : codTdoForFul();
0
Sujay U N

Wir können die statische Object.requireNonNull-Methode der Object-Klasse verwenden. Die Implementierung ist unten

public void someMethod(SomeClass obj) {
    Objects.requireNonNull(obj, "Validation error, obj cannot be null");
}
0
Akash Nema

Ihr letzter Vorschlag ist der Beste. 

if (foo != null && foo.bar()) {
    etc...
}

Weil:

  1. Es ist einfacher zu lesen.
  2. Es ist sicher: foo.bar () wird niemals ausgeführt, wenn foo == null ist.
  3. Es verhindert, dass schlechte Praktiken wie NullPointerExceptions (meistens aufgrund eines Fehlers in Ihrem Code) abgefangen werden.
  4. Es sollte so schnell oder sogar schneller als andere Methoden ausgeführt werden (obwohl ich denke, dass es fast unmöglich sein sollte, es zu bemerken).
0
C.Champagne