思考一个问题,以下代码是一个简单的饿汉式单例代码,显然在第一次初始化的时候会发生错误,导致单例的实例化失败,那么失败后可否继续尝试实例化呢?还是说下次使用时直接返回错误的对象或异常呢?
环境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-----------------