String重写equals空指针异常问题

前两天琢磨比较两个对象是否相等的方法,代码如下:

@Override
    public boolean equals(Object obj) {
        if (obj == this) {
            //如果两个对象是同一个对象,即返回true
            return true;
        } else if (obj.getClass() != this.getClass()) {
            //如果另一个对象和本对象类型不一样,即返回false
            return false;
        }
        
        KeQian4_2 a = (KeQian4_2) obj;

        if (this.name.equals(a.name) && this.age == a.age && this.gender == a.gender) {
        	//对比字段是否相同
                return true;
            }
        return false;
    }

结果:

Exception in thread "main" java.lang.NullPointerException

嗨呀呀,令人窒息,怎么就空指针异常了,于是我百度了一下,做了如下实验:

public class Test {

    public static void main(String[] args) {
        String a = null;
        System.out.println("Andy".equals(null));
        System.out.println(a.equals("Andy"));
    }
}

结果:

false
Exception in thread "main" java.lang.NullPointerException
	at PintA.Test.main(Test.java:15)

经过一番思考,得出如下结论:

null不是String类型的对象,调用不了String重写过得equals方法,如果强行调用,报错。

有了这个结论,最上面的错误也迎刃而解,w的name值是null,调用不了equals方法,所以出错。
将判断name是否为null的语句加到程序里就OK了:

    @Override
    public boolean equals(Object obj) {
        if (obj == this) {
            //如果两个对象是同一个对象,即返回true
            return true;
        } else if (obj.getClass() != this.getClass()) {
            //如果另一个对象和本对象类型不一样,即返回false
            return false;
        }
        KeQian4_2 a = (KeQian4_2) obj;
        if (this.name == null) {
            if (a.name != null) {
                return false;
            }
        }
        else if (this.name.equals(a.name) && this.age == a.age && this.gender == a.gender) {
             //对比字段是否相同
                return true;
            }
        return false;
    }

参考:
https://blog.csdn.net/coldh/article/details/50787343

原创文章 42 获赞 32 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_39671159/article/details/84075505