""与null区别 空指针异常机理

原创 2015年11月21日 08:42:29

String s1;
String s2 = null;
String s3 = "";
String s4 = "abc";


二、空指针异常机理

1.什么叫空指针异常:

空指针的概念:也就是只有变量名(指针变量)这个容器,里面没有任何的内存地址,也就是里面是空的,就叫空指针。

注:a、在java里方法是需要对象去调用的,格式如:对象名.方法名;

       b、java里的对象就是堆内存中内存地址中的内容,如上图中的"abc"就是一个对象。

空指针异常:既然空指针只是一个空壳,里面没有内存地址,也就无法再堆内存中找到对象了,那必然不能使用方法了,把空指针使用方法这种行为就叫空指针异常。

 判断一个变量是不是空指针最根本在于是否有对象(堆内存中分配了空间)

看栈内存中的变量名(也就是容器)中是否有内容(内存地址):一般只定义一个变量名,没有给它赋值,就属于这种情况,如顶端代码中的String s1。(没有给它赋值,在堆内存中没有给它分配空间,就不能调用方法了,)

如果有内存地址,去堆内存里看是否有和这个内存地址相同的另一个内存地址,找不到也是空指针:如顶端代码中的String s2 = null;给s2赋值null了,栈内存的容器中有内存地址了,但这个内存地址在堆内存中找不到和它相对应的另一个内存地址,(因为在堆内存里压根就没给它分配空间)可以认为这个内存地址是无用的,只是一个形式而已。

s1与s2的区别在于:s1连内存地址都没有,除了赋值操作外其他全会报错,而s2还可以进行参数的传递,仅仅是不能调用方法,因为没有具体对象。

2.s.equals("")  和  "".equals(s)的区别
String s;
这里的s就是变量名,在栈内存中被创建,创建出来后并没有给它初始化,也就是在堆内存中没有给它分配空间来存储具体值,没有空间就是没有内存地址,那么在栈内存中的容器里也就没有内容,这是个空指针;
String s = null;
这里给s赋值了null,null的含义可以理解为无用的内存地址,这个内存地址在堆内存中找不到相同的内存地址,也就相当于走个过场,告诉你在栈内存中变量名这个容器里有个内存地址。这与上一个是有区别的,不过也可以理解为空指针,因为找不到值,在堆内存中没有分配空间。
String s = "abc";
这里给s赋值了"abc","abc"在堆内存中的容器中,在java里叫做对象,这个容器的内存地址放在s中。通过s可以找到这个值,所以这不是空指针。
String s = "";
这里的""也是对象,在堆内存中也分配了空间,这个对象有点特殊,因为它的长度为0,但并不是没有,这个要清楚。就比如小明去参加考试,但一题不会写最后得了0分;和小明压根就没去考试,没有成绩是两码事。

if(s.equals(""))   如果s是空指针,它就不能调用任何方法,这里调用了equals方法就会报错
if("".equals(s))   ""是一个对象,对象就可以调用方法了,所以这里就不会报错了。
版权声明:本文为博主原创文章,欢迎转载。
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:""与null区别 空指针异常机理
举报原因:
原因补充:

(最多只允许输入30个字)