2012-08-26 15 views
19

In diesem Code.So überprüfen Sie den Nullwert in Java

public class Test { 
    public static void testFun(String str) { 
     if (str == null | str.length() == 0) { 
      System.out.println("String is empty"); 
     } else { 
      System.out.println("String is not empty"); 
     } 
    } 
    public static void main(String [] args) { 
     testFun(null); 
    } 
} 

Wir geben einen Nullwert an die Funktion testFun. Kompiliert gut, aber gibt eine nullPointerException in Laufzeit.

Angenommen, der Wert des tatsächlichen Arguments, das an testFun übergeben wird, wird von einem Prozess generiert. Angenommen, ein Nullwert wird von diesem Prozess zurückgegeben und an testFun übergeben. Wenn dies der Fall ist, wie überprüft man, ob der an die Funktion übergebene Wert null ist oder nicht?

Eine (seltsame) Lösung kann sein, indem Sie den formalen Parameter einer Variablen innerhalb der Funktion zuweisen und sie dann testen. Wenn jedoch viele Variablen an die Funktion übergeben werden, kann dies mühsam und undurchführbar werden. Wie kann man dann in einem solchen Szenario nach Nullwerten suchen?

Edit: Aus Versehen schrieb ich || statt | in der if-Bedingung. Laufzeitausnahme wird jetzt generiert

+0

bitte die Bearbeitung sehen. – Shades88

+1

Haben Sie vergessen, neu zu kompilieren? [Es erzeugt keine 'NullPointerException' für mich] (http://ideone.com/pRrB3). – oldrinb

Antwort

38

Die Edit zeigt genau den Unterschied zwischen Code, und Code funktioniert das nicht.

Diese Prüfung sowohl der Bedingungen immer auswertet, eine Ausnahme zu werfen, wenn str null ist:

if (str == null | str.length() == 0) { 

Während dieser (|| statt | verwenden) ist Kurzschließen - wenn die erste Bedingung wertet true aus, wird der zweite nicht ausgewertet.

Siehe section 15.24 der JLS für eine Beschreibung von || und section 15.22.2 für binäre |. Die Einleitung zu Abschnitt 15.24 ist jedoch das wichtige Bit:

Der Bedingungs- oder Operator || Betreiber ist wie | (§15.22.2), aber wertet seinen rechten Operanden nur aus, wenn der Wert seines linken Operanden falsch ist.

+4

475K ergab !!! (Bow ..) – Shades88

+3

@ Shades88 869k und zählen :) –

+2

@AndrasDeak Fliegen in Richtung einer Million O_o – 8bitcartridge

3

Das Problem hier ist, dass das Programm in Ihrem Code 'null.length()' aufruft, die nicht definiert ist, wenn das an die Funktion übergebene Argument null ist. Deshalb wird die Ausnahme ausgelöst.

+2

Es kommt nie zu diesem Teil des 'if' if' str == null'. – Keppil

+2

in der Bedingung if (str == null || str.length() == 0) wird der zweite Teil niemals ausgewertet, wenn der erste falsch ist. Wenn Sie möchten, dass der zweite Teil ausgewertet wird, würden Sie ihn wie folgt schreiben (str == null | str.length() == 0), so dass Sie einen Nullzeiger erhalten können. Sehen Sie nicht, warum Sie es in diesem Fall wollen, aber in einigen Fällen könnte dies von Vorteil sein. –

+1

tatsächlich tut es. || ist faul, aber er benutzt | welches wird beide Seiten bewerten –

2

können Sie StringUtils verwenden:

import org.apache.commons.lang3.StringUtils; 

if (StringUtils.isBlank(str)) { 

System.out.println("String is empty"); 

} else { 

System.out.println("String is not empty"); 

} 

Werfen Sie einen Blick hier auch: StringUtils.isBlank() vs String.isEmpty()

isBlank Beispiele:

StringUtils.isBlank(null)  = true 
StringUtils.isBlank("")  = true 
StringUtils.isBlank(" ")  = true 
StringUtils.isBlank("bob")  = false 
StringUtils.isBlank(" bob ") = false 
Verwandte Themen