前言:前段时间使用equals方法出现了一些小问题,我们往下看:
代码一:
public class TestEquals {
String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public boolean isSame() {
//出错代码块
if (name.equals("小明")) {
return true;
} else {
return false;
}
}
}
代码二(测试类):
public class Client {
public static void main(String[] args) {
TestEquals te = new TestEquals();
te.setName("小明");
if (te.isSame()){
System.out.println("他们是同一个人!");
}else {
System.out.println("他们不是同一个人!");
}
}
}
运行代码二,控制台显示如下结果:
他们是同一个人!
如果我们没有把name值设进去,看看会发生什么。
代码三:
public class Client {
public static void main(String[] args) {
TestEquals te = new TestEquals();
if (te.isSame()){
System.out.println("他们是同一个人!");
}else {
System.out.println("他们不是同一个人!");
}
}
}
运行代码,控制台显示如下结果:
Exception in thread “main” java.lang.NullPointerException
at com.china._02_equals.TestEquals.isSame(TestEquals.java:16)
at com.china._02_equals.Client.main(Client.java:8)
报了空指针异常,为什么会这样呢??
public boolean isSame() {
//出错代码块
if (name.equals("小明")) {
return true;
} else {
return false;
}
}
空指针异常出现的情况:
- 调用 null 对象的实例方法。
- 访问或修改 null 对象的字段。
- 将 null 作为一个数组,获得其长度。
- 将 null 作为一个数组,访问或修改其时间片。
- 将 null 作为 Throwable 值抛出
我们在测试类中,没有把name的值给设进去,这时isSame方法中的name的值为null,而null是没有比较字符串是否相等的equal方法,这时就报了空指针异常。
那有什么解决方法吗?
代码如下:
public boolean isSame() {
if ("小明".equals(name)) {
return true;
} else {
return false;
}
}
运行测试类代码三:
结果如下:
他们不是同一个人!
因为"小明"("“空字符串也可以调用equals方法,!”".equlas(name),这样可以判断name是否是空字符串,false为空字符串)是一个字符串,拥有equals方法,如果name为null,就会返回false,不会报空指针异常。
接着讲讲equals和==的区别:
代码如下:
public class Client {
public static void main(String[] args) {
String name1 = new String("小明");
String name2 = new String("小明");
System.out.println(name1 == name2);//false
System.out.println(name1.equals(name2));//ture
System.out.println("abc".equals("ABC"));//false
System.out.println("abc".equalsIgnoreCase("ABC"));//true
System.out.println("abc".equalsIgnoreCase("Abc"));//true
System.out.println("abc".equalsIgnoreCase("AbcD"));//false
}
}
测试结果我都用写在注释那里了,第一个为false是因为,用==比较的话,不止内容要相同,连存储空间地址都要相同才会返回true,因为name1和name2都是new出来的,两者的存储空间地址不一样,所以返回false。equals方法只比较内容,内容相同就返回true,但是没有忽略大小写,想要忽略大小写比较的话可以用equalsIgnoreCase这个方法。
如有错误,请指正,感谢。。