書くときのプロジェクトで問題が発生しました
制御層インタフェースがあるとします。
@ResponseBody @RequestMapping(値 = "テスト"、メソッド= RequestMethod.GETは、= "アプリケーション/ JSONを、文字セット= UTF-8"を生成) パブリック結果の<string> 試験(文字列ユーザ、列番号、文字列の時間){ 文字列型 = "エラー" ; 試す{ RTYPE = SendType.create_send.toString()。 返すfirstSendService.createSend(タイプ、のuName、PNUM、時間)。 } キャッチ(例外例){ LOGGER.error(ex.getMessage()、EX)。 } 戻り Result.failure(タイプ、「接続の失敗を」)。 }
このインターフェースを呼び出して、パラメータを渡すことはありませんでしたので、ユーザ、数、時間がNULLにデフォルト設定されますフロント。
そして、サービス層では、方法があります
公共の結果は、<文字列>(文字列型は、文字列のユーザは、列番号は、列時間)createSend スロー例外{ 文字列をトークン =「好きではありません」。 試す{ 場合(user.isEmpty()&& {StringUtils.isBlank(ユーザ)) を返す Result.failureを(タイプ、 "ユーザがnullでありません" )。 } のStringBufferのStringBuffer = 新規のStringBuffer(); stringBuffer.append(ユーザ).append(時間)。 ストリングsignChar = stringBuffer.toString()。 トークン = TokenUtil.sign(signChar)。 } キャッチ(例外例){ LOGGER.error(ex.getMessage()、EX)。 } 戻りResult.success(タイプ、トークン)。 }
前記パラメータについての検証
もし(user.isEmpty()&& StringUtils.isBlank(ユーザ)){ 返す( "ユーザがnullでない"、タイプResult.failureを) }
ビットを検証するために、判定条件が実行されるべきではありません。ここです
言い換えれば、法
その後)(StringUtils.isBlankを見て。
そして、「」ヌルになって試してみてください、
いいえ問題は、再度StringUtils.isNotBlankを()してみてくださいません。
上記のように、isNotBlank()の判定は、現在ISBLANK()のの変わり目れます。
そこで、我々は結論に来ます:
isEmpty()、文字列がtrueを返した場合、「」であるために(0);のisEmpty()を使用することはできませんがが、ヌル文字列を決定し、nullポインタ例外がエラーを報告します、
そのためのisEmpty()は、より適切な場合(STR == "" && str.isEmpty()){リターン}書き込みます
(1) 相较于 isEmpty() 只能判断 "" 的字符串, isBlank() 的功能性要更大更完善一些, 当字符串为 null 时, isBlank() 为 true; isNotBlank() 则跟 isBlank() 相反, 为 false.
所以 isBlank() 更适合写 if( str == null && StringUtils.isBlank(str)){ return } 或者 if( str == "" && StringUtils.isBlank(str)){ return }
但是
这样是不行的, 看来 isBlank() 好像看起来要更加全能一些, 因为有时候参数有可能为 null, 也有可能为"" ,用 isBlank() 的话可以避免服务器停掉, 如何优雅的抛出错误或者异常, 且避免服务器的运行因此受到影响, 是我在努力的一个方向, 希望这些可以有些帮助
再补上一点
这就奇怪了, 话说上面的 if( a.isEmpty() || StringUtils.isBlank(a)){ } 中, || 不是如果左边不成功就使用右边的判断条件么? 为什么会直接报错呢? 那如果是 || 的判断是先判断左边, 那在 a == "" 的时候,为什么又可以成功运行? isEmpty() 这么坑的么?
再来一组对比
那还是强烈推荐使用 isBlank() 吧, "" 和 isEmpty() 是局限性有点大, 灵活性不够高, 容易出事....