黑马程序员技术交流社区

标题: 关于单例设计模式,求解决 [打印本页]

作者: 陈志强    时间: 2013-3-9 11:28
标题: 关于单例设计模式,求解决
在模仿毕老师的代码上,就自己试着写了一遍,却发现出这样的问题,这是为什么?
  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. */
复制代码

作者: 张卫刚    时间: 2013-3-9 11:48
问题在于这两处产生的:
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不能方法调用所以就报错了,
作者: 张洪慊    时间: 2013-3-9 11:57
原因上面同学已说:
你可以在调方法之前测试下:
System.out.println(Single.getInstance());//null
作者: amen0205    时间: 2013-3-9 20:55
本帖最后由 门文通 于 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行就会发生空指针异常了
这是我的理解


作者: 黑马17期-闫东东    时间: 2013-3-9 21:24
Single s=new Single();应该是  s=new Single();
Sinle s; 默认是null,   {Single s=new Single();  }  return  s ; s指向null,s1,s2,s3  出现空指针异常。




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