A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 陈志强 中级黑马   /  2013-3-9 11:28  /  1622 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

在模仿毕老师的代码上,就自己试着写了一遍,却发现出这样的问题,这是为什么?
  1. class Single
  2. {
  3.         private int age;

  4.         private static Single s;

  5.         private Single(){};

  6.         public static Single getInstance()
  7.         {
  8.                 if (s==null)
  9.                 {
  10.                         Single s=new Single();//为什么这样写就会抛出异常呢?
  11.                 }
  12.                 return s;
  13.         }

  14.         public void setAge(int age)
  15.         {
  16.                 this.age=age;
  17.         }
  18.         public int getAge()
  19.         {
  20.                 return age;
  21.         }
  22.         public static void main(String[] args)
  23.         {
  24.                 Single s1=Single.getInstance();
  25.                 Single s2=Single.getInstance();
  26.                 Single s3=Single.getInstance();

  27.                 s2.setAge(33);
  28.                 System.out.println(s2.getAge());
  29.         }
  30. }
  31. /*

  32. E:\javafuxi\31>javac Single1.java

  33. E:\javafuxi\31>java Single
  34. Exception in thread "main" java.lang.NullPointerException
  35.         at Single.main(Single1.java:32)


  36. */
复制代码

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1 鼓励鼓励

查看全部评分

4 个回复

倒序浏览
问题在于这两处产生的:
if (s==null)
{
         Single s=new Single();// 1:Single s 这个s是你重定义的,只在if语句内有效  4:这块改成s=new Single();就ok了
}
return s;                            //2:而你反回这个是private static Single s;这个s,这个s你没new啊,默认就是null了

Single s2=Single.getInstance();
          s2.setAge(33);         //3:Single.getInstance()返回s2就是null,  null不能方法调用所以就报错了,

评分

参与人数 1技术分 +1 收起 理由
黄玉昆 + 1

查看全部评分

回复 使用道具 举报
原因上面同学已说:
你可以在调方法之前测试下:
System.out.println(Single.getInstance());//null
回复 使用道具 举报
本帖最后由 门文通 于 2013-3-9 21:00 编辑

你注释处  应为s=new  Single();   你写的是  Single  s=new  Single();   
1  你是新创建了一个对象 那原来对象的默认为null  
2  你的if语句  如果第一个s为null   则创建了一个新的对象也是s, 这时第二个s的作用范围 就是if  那返回的就是第一个s
3  这样 s1 s2 s3  就都是null  所以32行就会发生空指针异常了
这是我的理解

回复 使用道具 举报
Single s=new Single();应该是  s=new Single();
Sinle s; 默认是null,   {Single s=new Single();  }  return  s ; s指向null,s1,s2,s3  出现空指针异常。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马