2

commons StringUtils.isNotBlank() を使用して、文字列が空でも空白でもないかどうかを確認しています。空白の文字列または null のシナリオでは、入力の検証が期待どおりに行われないことがあります。Nullまたは空白が通過しています。

   if( StringUtils.isNotEmpty(obj.getvalue()) ){
        .............
    }

私が見つけたStringUtilsのドキュメントを調べると、

null 処理の副作用として、NullPointerException を StringUtils のバグと見なす必要があります (非推奨のメソッドを除く)。

それは何の用量を意味しますか?それは私のシナリオと何か関係がありますか?

4

5 に答える 5

4

あなたが引用したものの上の文を読んでください:

StringUtilsは、null入力文字列を静かに処理します。つまり、null入力はnullを返します。booleanまたはintが返される場所の詳細は、メソッドによって異なります。

null処理の副作用は、NullPointerExceptionがStringUtilsのバグと見なされる必要があることです(非推奨のメソッドを除く)。

したがって、null値を処理するため、NullPointerExceptionsをスローするべきではありません。

そして、メソッドをチェックアウトするとisNotBlank、次の表が見つかります。

 StringUtils.isNotBlank(null)      = false
 StringUtils.isNotBlank("")        = false
 StringUtils.isNotBlank(" ")       = false
 StringUtils.isNotBlank("bob")     = true
 StringUtils.isNotBlank("  bob  ") = true

他の値を受け取っている場合は、実際にバグが発生しているので、報告する必要があります。しかし、NPEは他の何かによって引き起こされている可能性が高いです。たとえば、他のStringUtilsメソッドがnullを返した可能性があります。

于 2013-01-29T09:42:57.983 に答える
2

空白の文字列または null のシナリオでは、入力の検証が期待どおりに行われないことがあります。Nullまたは空白が通過しています。

検証ロジックにバグがあるか、検証されていないソースからのデータがあります。

実際のコードと NPE スタックトレースを投稿していただければ、それを見つけるお手伝いができます。


どういう意味ですか?

StringUtils.isNotBlank()が NPE をスローする場合、メソッドにバグがあることを意味します。(javadoc が話している「副作用」は、論理的な副作用です。つまり、API の定義方法の二次的な論理的結果です。)

それは私のシナリオと何か関係がありますか?

それとは何の関係もありません...への呼び出しがNPEStringUtils.isNotBlank()をスローしていない限り。


アップデート

サンプルコードを検討してください(説明目的で調整されています):

if (StringUtils.isNotEmpty(obj.getvalue())){
    String s = obj.getvalue();
    if (s == null) {
        System.err.println("Ooops!!");
    }
}

このコードが NPE を発生させたり、"おっと!" を引き起こしたりする可能性のある多くのシナリオを考えることができます。印刷する。例えば:

  1. objである場合null、NPE は間違いなくスローされます。これは、「then」ブロックisNotEmptyで、または (obj変数の値を変更できる場合は変更できる場合) を呼び出す前に発生する可能性があります。

  2. getValueメソッドが NPE をスローする可能性があります。

  3. 呼び出しには、2 回目の呼び出しで の状態を変更し、別の値 (例: ) を返すgetValue副作用がある可能性があります (ほとんどありません) 。おっと!objnull

  4. obj現在のスレッドが上記のコードを実行している間に、他のスレッドがオブジェクトの状態を変更している可能性があります。おっと!

これらの問題のほとんどは、次のように「修正」できます。

String s = obj.getvalue();
if (StringUtils.isNotEmpty(s)){ // No NPE possible here now
    if (s == null) {
        System.err.println("Ooops!!");  // Cannot happen now.
    }
}
于 2013-01-29T09:45:36.147 に答える
0

問題を詳細に調べるために、コードがうまくいかない具体的な例を投稿することができます。

StringUtils の動作

  • StringUtils.isNotBlank(null) は false を返します
  • StringUtils.isNotBlank("") は false を返します
  • StringUtils.isNotBlank(" ") は false を返します
  • StringUtils.isNotBlank(" testvalue") は true を返します

動作が他のものである場合、これはライブラリのバグです

于 2013-01-29T09:44:32.727 に答える
0

obj.getvalue()StringUtils.isNotBlank() が NPE をスローしないため、NPE がスローされる可能性はありますか。コードをマルチスレッド環境で実行している場合は、メソッドを同期化して、複数のソースからメソッドに同時にアクセスできないようにすることができます。

さらにサポートが必要な場合は、stack traceまたはcode block?

于 2013-01-29T10:02:11.427 に答える