当前位置: 首页 > 知识库问答 >
问题:

访问静态字段时的NullPointerException

柯唯
2023-03-14

正如他们所说,System是最终的类,它将类型外的PrintStream作为字段成员,println是PrintStream类中的方法。

我创建了一个类UseNumber,其中静态字段no的类型为Number,只想访问Number类的方法,但它抛出了NullPointerException

public class Number {

    private int first;
    private int second;


    public int getFirst() {
        return first;
    }

    public void setFirst(int first) {
        this.first = first;
    }

    public int getSecond() {
        return second;
    }

    public void setSecond(int second) {
        this.second = second;
    }

}

对于UseNumber类

public class UseNumber {
    private static Number no;

    public static void main(String[] args) {
        UseNumber.no.setFirst(12); //throwing nullpointer exception here
        UseNumber.no.setSecond(22);
        System.out.println(UseNumber.no.getFirst()+UseNumber.no.getSecond());

    }


}

共有3个答案

壤驷承
2023-03-14

也许您可以编写一个接口方法来获取no的实例。在该方法中,您可以检查它是否为空,类似于我们处理Singleton模式的方式。

public class UseNumber {
 private static Number no;
 public static getNumberInstance() {
      if(no == NULL) {
         no = new Number(); //This will get executed only once, for first call.
      }
     return no;
 }
 public static void main(String[] args) {
    UseNumber.getNumberInstance().setFirst(12); 
    UseNumber.getNumberInstance().setSecond(22);
    System.out.println(UseNumber.getNumberInstance().getFirst() 
       +UseNumber.getNumberInstance().getSecond());

  }
}
贺飞
2023-03-14

当您尝试通过“.”运算符访问空对象时,会引发nullpointerException。在您指示抛出异常的行中,no对象为空,并且您正在尝试访问其setFirst方法,该方法当然会抛出空指针异常。

要修复错误,请初始化no对象,可能如下所示:

public class UseNumber {
private static Number no;

public static void main(String[] args) {
    UseNumber.no = new Number(); // Initialize here your no object 
    UseNumber.no.setFirst(12); //This line will no longer throw an exception.
    UseNumber.no.setSecond(22);
    System.out.println(UseNumber.no.getFirst()+UseNumber.no.getSecond());

}

}

倪培
2023-03-14

setFirst不是静态方法,它需要Number的实例。不是你创造的。您刚刚声明了一个名为no的数字变量。由于它在默认情况下被初始化为null,因此您将得到一个NullPointerException

解决方法之一:

private static Number no = new Number();

变量no在UseNumber中声明为静态,这意味着您将能够在没有UseNumber实例的情况下访问此对象。但是这个静态声明不会级联到no的方法。他们仍然需要一个实例,正如你所遇到的错误所强调的那样。

out系统的静态成员——但它已经是实例化对象了。

事实上,如果你查看系统的代码,你会发现这一行:

out = com.ibm.jvm.io.ConsolePrintStream.localize(new BufferedOutputStream(new FileOutputStream(FileDescriptor.out)), true);

所以当你说:

System.out

系统将为您提供其初始化的PrintStream对象。本质上,系统。出来println只是一个快捷方式:

PrintStream p = System.out;
p.println();
 类似资料:
  • 问题内容: 这是指帖子 ..无法回复或评论任何这样创建的新帖子。为什么是我的 发出警告-应该以静态方式访问静态字段MyUnits.MILLSECONDS吗?谢谢。 问题答案: 因为当您访问静态字段时,您应该在类(或本例中为枚举)上执行此操作。如 不在实例中 编辑 要解决 为什么这样 的问题:在Java中,当您将声明为时,就是说它是类的成员,而不是对象(因此为什么只有一个)。因此,在对象上访问它是没

  • 假设我有一个抽象超类。该类具有属性。 null 我怎么能这么做。

  • 问题内容: 在ES6中,给出以下示例: 如何访问Color.mainDark(静态字段)? 问题答案: 您可以按期望的方式访问它,但是,如果我记得使用Babel并立即导出类时存在一些问题,因此 如果 遇到问题,请在定义类后导出: 您可以在玛丽安(Marian)对类似问题的回答中了解有关巴别塔(Babel)问题的更多信息,该问题据说已在巴别塔(Babel)6.2.1中修复。

  • 问题内容: 只是为了澄清我正在考虑的这个权利,在Java中,静态字段是整个类使用的变量/字段,还是可以用于引用该类的所有对象?非静态字段是由对象定义的变量吗?并且与对象1引用相同类的第二个对象可以具有与对象1的静态字段不同的值吗? 问题答案: 与实例变量不同,在创建该类的实例之前,可以访问该类中的静态字段或静态类变量。在运行时创建该类的实例时,将创建该类中的实例变量(非静态变量)。因此,直到创建该

  • 我想澄清一下,在java中,静态字段是整个类使用的变量/字段,或者可以被引用该类的所有对象使用?非静态字段是由对象定义的变量?第二个对象引用与对象1相同的类,它可以对对象1的静态字段具有不同的值?

  • 我正在编写一个APEX触发器来验证对象上的数据输入。我有许多字段遵循类似的命名格式,并且都是相同的数据类型: 我想在字段中循环,如果验证失败,则添加一个错误: 问题是Object.get(字段名称)不返回对字段本身的引用。它返回该字段中的值。我在这里找到了一个线程 https://developer.salesforce.com/forums/?id=906F000000091aFIAQ 这似乎试