38

このコードでは。

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);
    }
}

null関数に値を渡しますtestFun。正常にコンパイルされますがNullPointerException、実行時に提供されます。これは私が予期していなかったことです。if条件を評価してtrue「Stringisempty」を出力するのではなく、なぜ例外をスローするのですか?


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

1つの(奇妙な)解決策は、関数内の変数に仮パラメーターを割り当ててからテストすることです。しかし、関数に渡される変数が多い場合、それは退屈で実行不可能になる可能性があります。では、そのようなシナリオでnull値をどのようにチェックするのでしょうか。

4

6 に答える 6

71

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

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

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

これ(||の代わりに使用|)は短絡ですが、最初の条件がと評価されたtrue場合、2番目の条件は評価されません。

の説明についてはJLSのセクション15.24||を、バイナリについてはセクション15.22.2を参照してください|。ただし、セクション15.24のイントロは重要な部分です。

条件付き演算子|| 演算子は|のようなものです (§15.22.2)ただし、左側のオペランドの値がfalseの場合にのみ、右側のオペランドを評価します。

于 2012-08-26T19:59:52.970 に答える
9

あなたが使用することができますStringUtils

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()vs String.isEmpty()

isBlank例:

StringUtils.isBlank(null)      = true
StringUtils.isBlank("")        = true  
StringUtils.isBlank(" ")       = true  
StringUtils.isBlank("bob")     = false  
StringUtils.isBlank("  bob  ") = false
于 2015-06-25T08:48:44.160 に答える
5

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

于 2012-08-26T19:50:55.950 に答える
4

問題は、ビット単位または演算子を使用していることです|。論理演算子または演算子、を使用すると||、コードは正常に機能します。

参照: http:
//en.wikipedia.org/wiki/Short-circuit_evaluation
Javaの&と&&の違いは?

于 2012-08-26T19:57:59.743 に答える
1

下の行を変更

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

の中へ

if (str == null || str.isEmpty()) {

これで、コードはcorectllyで実行されます。nullを呼び出すとが発生するため、必ずstr.isEmpty()後で実行してください。Javaは、trueの場合に短絡評価を使用するため、評価されませんstr == nullisEmpty()NullPointerExceptionstr == nullstr.isEmpty()

于 2019-07-22T11:05:02.257 に答える
0

| そして&毎回両側をチェックしてください。

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

ここでは、NullPointerExceptionが発生する可能性が高くなります

論理|| 必要な場合にのみ、右側を確認してください。

しかし、論理演算子を使用します

RHSをチェックしないため、NPEを取得する機会はありません

于 2020-02-04T07:23:08.323 に答える