正如他们所说,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());
}
}
也许您可以编写一个接口方法来获取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());
}
}
当您尝试通过“.”运算符访问空对象时,会引发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());
}
}
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 这似乎试