java.lang.NullPointException空指针异常踩坑—a.equals(b)

平凡也就两个字: 懒和惰;
成功也就两个字: 苦和勤;
优秀也就两个字: 你和我。
跟着我从0学习JAVA、spring全家桶和linux运维等知识,带你从懵懂少年走向人生巅峰,迎娶白富美!
关注微信公众号【 IT特靠谱 】,每天都会分享技术心得~

NullPointException空指针异常踩坑—a.equals(b)

      今天在测试环境发现了一个bug,就是大名鼎鼎的空指针异常java.lang.NullPointException。这个问题是非常好解决的,因为导致空指针异常的无外乎就那几种情况。这里我遇到了其中之一:a.equals(b),即比较a和b两个字符串是否相等
      问题原因:我想比较a和b两个字符串是否相等,但是搞忘了a可能为null的情况,所以抛出了空指针异常!
      解决办法:在工作生产过程中,比较两个字符串或对象是否相等,尽量不要用a.equals(b)的方式,推荐用Objects.equals(a, b)来代替,当然也可以用Optional。
      下面的代码演示了用Objects.equals(b)来比较两个对象是否相等,避免了a对象为null时抛出空指针异常的情况。

import java.util.Objects;

public class Main {

  public static void main(String[] args) {
    equalsTest();
  }

  /**
   * 测试a.equals(b)和Objects.equals方法
   */
  private static void equalsTest() {
    String a = "1";
    String b = "1";
    System.out.println("a.equals(b):" + a.equals(b));

    try {
      a = null;
      b = "1";
      //这里会抛空指针异常!
      a.equals(b);
    } catch (Exception e) {
      System.out.println("a.equals(b)报空指针异常!");
      e.printStackTrace();
    }

    a = "1";
    b = "1";
    System.out.println("Objects.equals(a, b):" + Objects.equals(a, b));

    a = null;
    b = "1";
    System.out.println("Objects.equals(a, b)不报空指针异常:" + Objects.equals(a, b));
  }
}

      运行结果:

       为什么Objects.equals(a, b)能避免产生空指针异常呢,我们需要从其源码进行分析(下图)。从源码逻辑可以分析可知:

       (1)如果a为null,且b为null的时候(a==b)为true;

       (2)如果a为null,且b不为null的时候(a==b)为false;

       (3)如果a不为null时,实际上调用的是a.eauqls(b)方法,因为a不为null,所以不会抛空指针异常。

    /**
     * Returns {@code true} if the arguments are equal to each other
     * and {@code false} otherwise.
     * Consequently, if both arguments are {@code null}, {@code true}
     * is returned and if exactly one argument is {@code null}, {@code
     * false} is returned.  Otherwise, equality is determined by using
     * the {@link Object#equals equals} method of the first
     * argument.
     *
     * @param a an object
     * @param b an object to be compared with {@code a} for equality
     * @return {@code true} if the arguments are equal to each other
     * and {@code false} otherwise
     * @see Object#equals(Object)
     */
    public static boolean equals(Object a, Object b) {
        return (a == b) || (a != null && a.equals(b));
    }

      如果你有问题或需要更进一步学习,关注微信公众号吧!

猜你喜欢

转载自blog.csdn.net/IT_Most/article/details/109120664
今日推荐