黑马程序员技术交流社区
标题:
关于单例设计模式,求解决
[打印本页]
作者:
陈志强
时间:
2013-3-9 11:28
标题:
关于单例设计模式,求解决
在模仿毕老师的代码上,就自己试着写了一遍,却发现出这样的问题,这是为什么?
class Single
{
private int age;
private static Single s;
private Single(){};
public static Single getInstance()
{
if (s==null)
{
Single s=new Single();//为什么这样写就会抛出异常呢?
}
return s;
}
public void setAge(int age)
{
this.age=age;
}
public int getAge()
{
return age;
}
public static void main(String[] args)
{
Single s1=Single.getInstance();
Single s2=Single.getInstance();
Single s3=Single.getInstance();
s2.setAge(33);
System.out.println(s2.getAge());
}
}
/*
E:\javafuxi\31>javac Single1.java
E:\javafuxi\31>java Single
Exception in thread "main" java.lang.NullPointerException
at Single.main(Single1.java:32)
*/
复制代码
作者:
张卫刚
时间:
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