古いコードの変更を確認したところ、非常に興味深い変更がありました。違いがあります:
if(retValue.equals("") || retValue == null){
if(retValue == null || retValue.equals("")){
助言がありますか?jvmとの違いは何ですか?
ありがとう。
古いコードの変更を確認したところ、非常に興味深い変更がありました。違いがあります:
if(retValue.equals("") || retValue == null){
if(retValue == null || retValue.equals("")){
助言がありますか?jvmとの違いは何ですか?
ありがとう。
もちろん。明確な違いがあります。たとえば、最初の例では、retValue が null の場合に NullPointerException が発生します。
||
and&&
演算子は「怠惰」です。JVM は、結果が確定するとすぐに式の評価を停止します。
||
、オペランドの 1 つが true になるとすぐに停止します ==> 式全体が true になります。&&
、オペランドの 1 つが false ==> 式全体が false になるとすぐに停止します。JLS #15.24からの引用(強調鉱山):
条件付きOR
||
演算子は|
(§15.22.2)と似ていますが、左側のオペランドの値が false の場合にのみ右側のオペランドを評価します。
OR は、どちらかのステートメントが true の場合に true を返します。これは、if が最初のステートメントのみをチェックすることを意味します (たとえば、コードの 2 行目)。
retValue == null
最初が true の場合、2 番目はチェックしません。これは、retValue が null の場合、コードの 1 行目は NullPointerException を意味する可能性がありますが、2 行目は同じ入力に対して NullPointerException を持たないことを意味します。