2017-01-20 20 views
2

Ich folge diesem post, um eine threadsichere Singleton-Klassen zu erstellen, aber es gibt einen Kompilierfehler in INSTANCE. Es sagte The blank final field INSTANCE may not have been initialized. Meine Anforderung ist, ich will INSTANCE ist null und das Programm protokolliert diesen Fehler und versuchen Sie dieses Objekt erneut zu init. Wenn das Programm weiterhin fehlschlägt, wird das Programm beendet.Das leere letzte Feld INSTANCE wurde möglicherweise nicht initialisiert

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; 
    } 
} 

Aber wenn ich den Code wie folgt verwenden, einen weiteren Fehler: 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; 
    } 
} 

Aber wenn ich den Code wie folgt verwenden keine Pop-up-Fehler.

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; 
    } 
} 

Warum das passiert?

+1

Nun ja ... Sie sehen, dass TODO? Mach es :) Was willst du * wenn es einen 'AxisFault' gibt? Momentan hast du noch nichts "INSTANCE" zugewiesen ... vielleicht solltest du eine 'RuntimeException' einpacken' e'? Sie sind im Grunde sowieso an diesem Punkt abgespritzt ... –

+0

Der Fehler "Das leere letzte Feld INSTANCE konnte nicht initialisiert werden" besagt einfach, dass Sie das Feld nicht initialisiert haben ... _private static final ServiceSoapBindingStub INSTANCE = null; _ sollte diese Nachricht loswerden. Natürlich hat Jon Recht, du musst deinen Code unbedingt verbessern. –

+0

Dies entfernt die Fehlermeldung, aber nicht den Fehler. –

Antwort

2

Gegeben, was Sie gesagt haben, sollten Sie keine Klasseninitialisierung dafür verwenden. Insbesondere gilt Folgendes:

  • wollen Sie mehrmals
  • Sie möchten verwenden, um eine geprüfte Ausnahme

Beide von denen sind möglich, um zu versuchen, aber Sie werden die Initialisierung in die getInstance Methode bewegen müssen :

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; 
     } 
    } 
} 

(. Sie haben die Ausnahme, es zu melden Sie sich fangen und dann erneut auslösen, natürlich - aber prüfen, ob ein höheres Niveau es trotzdem anmelden würde)

Verwandte Themen