黑马程序员技术交流社区

标题: 程序运行过程中出现了空指针异常 [打印本页]

作者: 张超超    时间: 2012-4-18 18:20
标题: 程序运行过程中出现了空指针异常
class Person
{
        String name;
        int age;
        /*
        public void eat()
        {
            //System.out.println("年龄:"+p2.age);
            //System.out.println("姓名:"+p2.name);
            System.out.println("正在吃饭!");
        }
        */
        
}

public class Test
{
        public static void main(String[] args)
        {
                Person p1 = null;
                Person p2 = null;
               
                p1 = new Person();
               
                //p1.eat();
                p1.name="李四";
                p1.age= 23;
               
                p1=p2;
                System.out.println("姓名:"+p2.name);
        System.out.println("年龄:"+p2.age);
        
                p1=null;
        }
}
运行这个程序时出现了空指针异常,本人新手求高手来解答。
作者: chenwei    时间: 2012-4-18 18:26
p1=p2;
p2是null,
下面p2.name
p2.age就空指针异常了啊
应该是p2=p1;吧
作者: 光sail    时间: 2012-4-18 18:43
p1=p2的意思是p2指向的对象赋值给p1,y因为p2=null,所以p1=null;所以出现空指针异常,
想要把p1指向的对象赋值给p2,应该p2=p1.
作者: 方江    时间: 2012-4-18 18:44
嗯,其实就是。当你先new p1的person并给p1赋值的时候。p1已经有了年龄和姓名。
但当你p1=p2的时候。p2初始化默认为null.那么也就意味着再次给p1赋值为了null.
既然都是空,打印出来就是空指针异常了。
还有一点要注意,最好别在主函数class前面加静态。
代码如下:
class Person
{
        String name;
        int age;
        /*
        public void eat()
        {
            //System.out.println("年龄:"+p2.age);
            //System.out.println("姓名:"+p2.name);
            System.out.println("正在吃饭!");
        }
        */
        
}

class Test
{
        public static void main(String[] args)
        {
                Person p1 = null;
                Person p2 = null;
               
                p1 = new Person();
               
                //p1.eat();
                p1.name="李四";
                p1.age= 23;
               
                p2=p1;
                System.out.println("姓名:"+p2.name);
        System.out.println("年龄:"+p2.age);
        
                p1=null;
        }
}

作者: 陈坚    时间: 2012-4-18 19:02
p1 = new Person();//这里给p1分配了内存空间
p1.name="李四";//给p1的属性赋值
p1.age= 23;
当p1=p2时就将p1的值置空了(p2本身就为空,在内存中没有分配有存储空间),所以在p2.name时就会有空指针异常
作者: 马东华    时间: 2012-4-18 19:11
   p1=p2;//意思是把p2的值赋给p1,而你的目的是把p1赋p2,所以,换一下 就对了 p2=p1;
                System.out.println("姓名:"+p2.name);

作者: 李平    时间: 2012-4-18 19:38
p1 = new Person();但p2仍然是null
p1 = p2;意味着把 null 又赋给了p1
c此时p1为空,所以打印空指针异常了。
换成p2 = p1;
作者: 刘_浩    时间: 2012-4-18 20:47
哥们当然 是空的呀。你想想看,你是不是要把p1赋给p2呀,结果把p2赋给了p1。所以当然是空咯。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2