public class StringDemo {
public static void main(String[] args) {
String str1 = "hello";
String str2 = null;
System.out.println(str1.equals(str2));
}
}
运行结果: false
public class StringDemo {
public static void main(String[] args) {
String str1 = "hello";
String str2 = null;
System.out.println(str2.equals(str1));
}
}
运行结果:空指针异常
报空指针,为啥嘞?为啥st1.equals(str2)会打印false,而str2.equals(str1)就报空指针
3 个解决方案
#1
1. Calling the instance method of a null object.
2. Accessing or modifying the field of a null object.
3. Taking the length of null as if it were an array.
4. Accessing or modifying the slots of null as if it were an array.
5. Throwing null as if it were a Throwable value.
总共五种情况会抛NPE,你的是第一种,调用了空对象的实例方法
st1.equals(str2)的情况不属于五种所列~
2. Accessing or modifying the field of a null object.
3. Taking the length of null as if it were an array.
4. Accessing or modifying the slots of null as if it were an array.
5. Throwing null as if it were a Throwable value.
总共五种情况会抛NPE,你的是第一种,调用了空对象的实例方法
st1.equals(str2)的情况不属于五种所列~
#2
楼主大大
从根源上分析就是java开发者在重写String的equals方法的时候考虑到你会传进去null啦!
不信你打开equals方法(按住ctrl点击那个equals),重写方法里有这么一个判断:
public boolean equals(String str){
if(str == null){
return false;
}
}
所以说,当你 "字符串".equals(str1);时就不会报空指针异常啦!这也就是为什么当我们创建一个类重写该类的equals方法是必须要写str == null这个判断啦!就是为了避免空指针咯!纯手打,希望楼主能喜欢!
从根源上分析就是java开发者在重写String的equals方法的时候考虑到你会传进去null啦!
不信你打开equals方法(按住ctrl点击那个equals),重写方法里有这么一个判断:
public boolean equals(String str){
if(str == null){
return false;
}
}
所以说,当你 "字符串".equals(str1);时就不会报空指针异常啦!这也就是为什么当我们创建一个类重写该类的equals方法是必须要写str == null这个判断啦!就是为了避免空指针咯!纯手打,希望楼主能喜欢!
#3
你这里使用的str2字符串对象是null,表示没有指向任何对象,在执行str2.equal()方法时,虚拟机会发现str2不能调用其实例方法equals(),所以返回异常,表明这是一个需要引起注意的地方;反过来str1.equals(str2),str1不为null,所以不会抛出异常,一个不为空,一个为空,当然返回false
#1
1. Calling the instance method of a null object.
2. Accessing or modifying the field of a null object.
3. Taking the length of null as if it were an array.
4. Accessing or modifying the slots of null as if it were an array.
5. Throwing null as if it were a Throwable value.
总共五种情况会抛NPE,你的是第一种,调用了空对象的实例方法
st1.equals(str2)的情况不属于五种所列~
2. Accessing or modifying the field of a null object.
3. Taking the length of null as if it were an array.
4. Accessing or modifying the slots of null as if it were an array.
5. Throwing null as if it were a Throwable value.
总共五种情况会抛NPE,你的是第一种,调用了空对象的实例方法
st1.equals(str2)的情况不属于五种所列~
#2
楼主大大
从根源上分析就是java开发者在重写String的equals方法的时候考虑到你会传进去null啦!
不信你打开equals方法(按住ctrl点击那个equals),重写方法里有这么一个判断:
public boolean equals(String str){
if(str == null){
return false;
}
}
所以说,当你 "字符串".equals(str1);时就不会报空指针异常啦!这也就是为什么当我们创建一个类重写该类的equals方法是必须要写str == null这个判断啦!就是为了避免空指针咯!纯手打,希望楼主能喜欢!
从根源上分析就是java开发者在重写String的equals方法的时候考虑到你会传进去null啦!
不信你打开equals方法(按住ctrl点击那个equals),重写方法里有这么一个判断:
public boolean equals(String str){
if(str == null){
return false;
}
}
所以说,当你 "字符串".equals(str1);时就不会报空指针异常啦!这也就是为什么当我们创建一个类重写该类的equals方法是必须要写str == null这个判断啦!就是为了避免空指针咯!纯手打,希望楼主能喜欢!
#3
你这里使用的str2字符串对象是null,表示没有指向任何对象,在执行str2.equal()方法时,虚拟机会发现str2不能调用其实例方法equals(),所以返回异常,表明这是一个需要引起注意的地方;反过来str1.equals(str2),str1不为null,所以不会抛出异常,一个不为空,一个为空,当然返回false