if statement checks for null but still throws a NullPointerException

后端 未结 6 2089
無奈伤痛
無奈伤痛 2020-12-05 09:35

In this code.

public class Test {
     public static void testFun(String str) {
         if (str == null | str.length() == 0) {
             System.out.print         


        
相关标签:
6条回答
  • 2020-12-05 10:04

    You can use 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");
    
    }
    

    Have a look here also: StringUtils.isBlank() vs String.isEmpty()

    isBlank examples:

    StringUtils.isBlank(null)      = true
    StringUtils.isBlank("")        = true  
    StringUtils.isBlank(" ")       = true  
    StringUtils.isBlank("bob")     = false  
    StringUtils.isBlank("  bob  ") = false
    
    0 讨论(0)
  • 2020-12-05 10:09

    The problem here is that in your code the program is calling 'null.length()' which is not defined if the argument passed to the function is null. That's why the exception is thrown.

    0 讨论(0)
  • 2020-12-05 10:16

    The | and & check both the sides everytime.

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

    here we have high possibility to get NullPointerException

    Logical || and && check the right hand side only if necessary.

    but with logical operator

    no chance to get NPE because it will not check RHS

    0 讨论(0)
  • 2020-12-05 10:19

    Change Below line

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

    into

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

    now your code will run corectlly. Make sure str.isEmpty() comes after str == null because calling isEmpty() on null will cause NullPointerException. Because of Java uses Short-circuit evaluation when str == null is true it will not evaluate str.isEmpty()

    0 讨论(0)
  • 2020-12-05 10:20

    The problem is that you are using the bitwise or operator: |. If you use the logical or operator, ||, your code will work fine.

    See also:
    http://en.wikipedia.org/wiki/Short-circuit_evaluation
    Difference between & and && in Java?

    0 讨论(0)
  • 2020-12-05 10:22

    The edit shows exactly the difference between code that works and code that doesn't.

    This check always evaluates both of the conditions, throwing an exception if str is null:

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

    Whereas this (using || instead of |) is short-circuiting - if the first condition evaluates to true, the second is not evaluated.

    See section 15.24 of the JLS for a description of ||, and section 15.22.2 for binary |. The intro to section 15.24 is the important bit though:

    The conditional-or operator || operator is like | (§15.22.2), but evaluates its right-hand operand only if the value of its left-hand operand is false.

    0 讨论(0)
提交回复
热议问题