2012-08-26 17 views
19

このコードでは。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); 
    } 
} 

testFunにヌル値を渡します。コンパイルは正常ですが、実行時にはnullPointerExceptionとなります。

testFunに渡される実際の引数の値が、あるプロセスから生成されたとします。誤ってnull値がそのプロセスによって返され、testFunに供給されると仮定します。そのような場合は、関数に渡された値がnullであるかどうかをどのように検証しますか?

1つの(奇妙な)解決策は、仮パラメータを関数内の変数に代入してテストすることです。しかし、関数に渡される変数がたくさんある場合、それは退屈で実行不能になる可能性があります。このようなシナリオでヌル値をチェックする方法は?

編集:誤って私は書いた|| |の代わりに| if条件で実行時例外が生成される

+0

を編集を参照してください。 – Shades88

+1

再コンパイルを忘れましたか? [それは私のために 'NullPointerException'を生成しません](http://ideone.com/pRrB3)。 – oldrinb

答えて

38

編集は正確にない動作するコードとコードの違いを示しています。

このチェックは常にstrがnullの場合、例外をスロー、条件の両方を評価:

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

この(代わり|||を使用)が短絡であるが - 最初の状態であればtrueと評価され、2番目の値は評価されません。

||の説明についてはsection 15.24、バイナリ|の場合はsection 15.22.2を参照してください。しかし、セクション15.24へのイントロは重要なビットです:

条件演算子||オペレータはのようです| (15.22.2)、その左側のオペランドの値がfalseの場合にのみ、その右側のオペランドを評価します。

+4

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

+3

@ Shades88 869kと数えて: –

+2

@AndrasDeak百万に向かって飛び回るO_o – 8bitcartridge

3

ここでの問題は、プログラムに渡された引数がnullの場合にプログラムが 'null.length()'を呼び出していることです。そのため、例外がスローされます。

+2

'str == null'の場合、' if'のその部分に決して行きません。 – Keppil

+2

if(str == null || str.length()== 0)条件では、最初の要素がfalseの場合、2番目の部分は評価されません。 2番目の部分を評価したい場合は、if(str == null | str.length()== 0)と書くと、nullpointerを得ることができます。この場合、なぜあなたがそれを望むのか分からないが、場合によってはこれが有益かもしれない。実際には –

+1

です。 ||怠け者だが、彼は|どちらも評価されます –

2

あなたはStringUtilsを使用することができます。StringUtils.isBlank() vs String.isEmpty()

isBlank例:

import org.apache.commons.lang3.StringUtils; 

if (StringUtils.isBlank(str)) { 

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

} else { 

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

} 

こちらも見てください

StringUtils.isBlank(null)  = true 
StringUtils.isBlank("")  = true 
StringUtils.isBlank(" ")  = true 
StringUtils.isBlank("bob")  = false 
StringUtils.isBlank(" bob ") = false 
関連する問題