空白の文字列または 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 を発生させたり、"おっと!" を引き起こしたりする可能性のある多くのシナリオを考えることができます。印刷する。例えば:
obj
である場合null
、NPE は間違いなくスローされます。これは、「then」ブロックisNotEmpty
で、または (obj
変数の値を変更できる場合は変更できる場合) を呼び出す前に発生する可能性があります。
getValue
メソッドが NPE をスローする可能性があります。
呼び出しには、2 回目の呼び出しで の状態を変更し、別の値 (例: ) を返すgetValue
副作用がある可能性があります (ほとんどありません) 。おっと!obj
null
obj
現在のスレッドが上記のコードを実行している間に、他のスレッドがオブジェクトの状態を変更している可能性があります。おっと!
これらの問題のほとんどは、次のように「修正」できます。
String s = obj.getvalue();
if (StringUtils.isNotEmpty(s)){ // No NPE possible here now
if (s == null) {
System.err.println("Ooops!!"); // Cannot happen now.
}
}