静态变量初始化java

静态变量初始化java,java,static,initialization,Java,Static,Initialization,如何在java中初始化类的私有静态成员 尝试以下操作: public class A { private static B b = null; public A() { if (b == null) b = new B(); } void f1() { b.func(); } } 但在创建类a的第二个对象并调用f1()时,我得到一个空指针异常。您的代码应该可以工作。你确定你发布的是准确的代码吗 您还可以更直接地

如何在java中初始化类的私有静态成员

尝试以下操作:

public class A {
   private static B b = null;
   public A() {
       if (b == null)
         b = new B();
   }

   void f1() {
         b.func();
   }
}

但在创建类a的第二个对象并调用f1()时,我得到一个空指针异常。

您的代码应该可以工作。你确定你发布的是准确的代码吗


您还可以更直接地初始化它:

    public class A {

      private static B b = new B();

      A() {
      }

      void f1() {
        b.func();
      }
    }

初始化静态成员的首选方法是(如前所述)

或者,对于更复杂的初始化代码,可以使用静态初始化程序块:

private static final B a;

static {
  a = new B();
}

你应该在哪行代码上使用公共构造函数,你会得到空指针异常?我认为你应该更正变量名,静态a是B的实例,这很容易混淆,你也应该发布类B,可能NPE在那里被提升。这只是示例代码。在实际代码中,我使用的是另一个库。我在java.util.Collections.sort函数中得到一个错误。堆栈跟踪显示已调用func,并且库中有一些内部调用。上面的代码有问题吗?@KLE,因为一些网络问题,这被发布了两次。我将删除另一个。我使用一个静态初始值设定项块作为B的构造函数引发异常。但我还是犯了同样的错误。对库函数的第一次调用有效,但第二次调用无效。在我看来,初始化静态成员的首选方法取决于实际情况。通过此模式创建所有静态成员的软件在应用程序启动期间会受到性能影响。对于非常重要的情况,正是出于这个原因,我喜欢惰性初始化模式。@rsp:您对性能的关注是正确的(正确地说,它不是在启动时,而是在类加载时-可能是相同的,但不必如此)。我仍然认为这种初始化静态成员的方式是首选的,因为初始化会懒惰地增加代码的复杂性,这是除了好的原因之外应该避免的。性能可能是一个这样的原因。@ IAMROHITBANGA:考虑添加更多的代码和Null PoExtExchange的STATKTrack来获得帮助。代码会更加混乱。我这样做了:if(b==null)str=“error”;str设置为“error”,这似乎是API特有的问题。
private static final B a;

static {
  a = new B();
}