思考一个问题,以下代码是一个简单的饿汉式单例代码,显然在第一次初始化的时候会发生错误,导致单例的实例化失败,那么失败后可否继续尝试实例化呢?还是说下次使用时直接返回错误的对象或异常呢?
环境HotSpotJVM 1.6
/**
*
* @author lidongbo
* @date 2012-7-11
*/
public class Foo {
private static final Foo foo = new Foo();
private static int count = 0;
private Foo(){
init();
}
private void init(){
//do sth.
if(count == 0){
//制造一个空指针
System.out.println(foo.hashCode());
}else{
System.out.println("实例化成功!");
}
count++;
}
public static final Foo getInstance(){
return foo;
}
}
/**
*
* @author lidongbo
* @date 2012-7-11
*/
public class Test {
public static void main(String[] args) {
try {
System.out.println(Foo.getInstance());
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("-------------1-----------------");
try {
System.out.println(Foo.getInstance());
} catch (Throwable e) {
e.printStackTrace();
}
System.out.println("-------------2-----------------");
}
}
答案揭晓:
再第二此实例的时候,JVM直接异常给我们了.
java.lang.ExceptionInInitializerError
at Test.main(Test.java:13)
Caused by: java.lang.NullPointerException
at Foo.init(Foo.java:19)
at Foo.<init>(Foo.java:12)
at Foo.<clinit>(Foo.java:9)
... 1 more
java.lang.NoClassDefFoundError: Could not initialize class Foo
at Test.main(Test.java:19)
-------------1-----------------
-------------2-----------------
本文深入分析了一段使用饿汉式单例模式的Java代码,在初始化过程中遇到空指针异常的情况,并讨论了如何优雅地处理此类异常,确保程序的稳定性和健壮性。
3188

被折叠的 条评论
为什么被折叠?



