繁体   English   中英

空白的最终字段 INSTANCE 可能尚未初始化

[英]The blank final field INSTANCE may not have been initialized

我按照这篇文章创建了一个线程安全的单例类,但是在 INSTANCE 中有一个编译错误。 它说The blank final field INSTANCE may not have been initialized 我的要求是我希望 INSTANCE 为空并且程序记录此错误并再次尝试初始化此对象。 如果仍然失败,程序退出。

public  class ServiceConnection {
    private static class SingletonObjectFactoryHolder{
      private static final ServiceSoapBindingStub  INSTANCE;
      static
         {
            try {
                INSTANCE = new ServiceSoapBindingStub();

            } catch (AxisFault e) {
               // TODO Auto-generated catch block
               e.printStackTrace();             
            }
         }  
    }

    public static ServiceSoapBindingStub getInstance() {
        return SingletonObjectFactoryHolder.INSTANCE;
    }   
} 

但是,如果我按如下方式使用代码, The final field INSTANCE may already have been assigned出现另一个错误: The final field INSTANCE may already have been assigned

public  class ServiceConnection {
    private static class SingletonObjectFactoryHolder{
      private static final ServiceSoapBindingStub  INSTANCE;
      static
         {
            try {
                INSTANCE = new ServiceSoapBindingStub();

            } catch (AxisFault e) {
               INSTANCE = null;
               e.printStackTrace();             
            }
         }  
    }

    public static ServiceSoapBindingStub getInstance() {
        return SingletonObjectFactoryHolder.INSTANCE;
    }   
} 

但是,如果我按如下方式使用代码,则不会弹出错误。

public  class ServiceConnection {
    private static class SingletonObjectFactoryHolder{
      private static final ServiceSoapBindingStub  INSTANCE;
      static
         {
            try {
                INSTANCE = new ServiceSoapBindingStub();

            } catch (AxisFault e) {
               e.printStackTrace();
               throw new RuntimeException();                    
            }
         }  
    }

    public static ServiceSoapBindingStub getInstance() {
        return SingletonObjectFactoryHolder.INSTANCE;
    }   
}

为什么会发生这种情况?

鉴于您所说的,您不应该为此使用类初始化。 特别是:

  • 你想尝试多次
  • 您想使用已检查的异常

这两个都是可行的,但您需要将初始化移动到getInstance方法中:

public  class ServiceConnection {
    private static final Object lock = new Object();
    private static ServiceSoapBindingStub instance;

    public static ServiceSoapBindingStub getInstance() throws AxisFault {
        // Note: you could use double-checked locking here if you really
        // wanted.
        synchronized (lock) {
            if (instance == null) {
                instance = new ServiceSoapBindingStub();
            }
            return instance;
        }
    }   
}

(当然,您可以捕获异常以记录它然后重新抛出 - 但请考虑更高级别是否会记录它。)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM