做项目时equals方法中经常报空指针异常,先从源码分析。
public boolean equals(Object anObject) {
if (this == anObject) {
return true;
//首先判断的是,是否是一个对象,若是,则直接返回true;
}
if (anObject instanceof String) {
//判断是否可以强制类型转换
String anotherString = (String)anObject;
//进行强制类型转换
int n = value.length;
//获得当前值的字符串 长度
if (n == anotherString.value.length) {
//判断两个String类型数据长度是否相同
char v1[] = value;
char v2[] = anotherString.value;
//转换为数组类型的字符数据
int i = 0;
while (n-- != 0) {
//倒序循环每一个字符
if (v1[i] != v2[i])
//如果有一个字符相同则返回false
return false;
i++;
}
//每一个字符都相同 则返回true
return true;
}
}
return false;
}
测试equals前为空是否报异常
public class Testequals {
public static void main(String[] args) {
String a = "";
String b = "sdf";
System.out.println(a.equals(b));
}
}//无异常
public class Testequals {
//空指针异常
public static void main(String[] args) {
String a = null;
String b = "sdf";
System.out.println(a.equals(b));
}
}
测试equals后为空是否报异常
public class Testequals {
public static void main(String[] args) {
String a = "";
String b = "sdf";
System.out.println(b.equals(a));
}
}//无异常
public class Testequals {
public static void main(String[] args) {
String a = null;
String b = "sdf";
System.out.println(b.equals(a));
}
}//空指针异常
总结:可以看出String a指向一个“”和String a没有的引用对象,是不同的。当a指向”“时,不会报异常,当a是一个空引用的时候会报异常。因为String a没有被初始化,是一个空的引用。但是却想要调用String中的,equals方法。所以就报空指针异常了。
不明白的地方:这不应该是个死循环吗,它是怎么处理的。