我试图了解System.out如何调用println()。所有搜索都说System.out是PrintStream类的一个实例,因此它可以调用该类中的方法。
但是...
当我尝试使用以下NullPointerException结果复制它时。
public class Main {
public static void main(String[] args){
Tasker.calc.add(1, 2);
}
}
class Tasker{
static Calc calc;
}
class Calc {
public void add(int x, int y){
System.out.println(x+y);
}
}
Tasker.calc不是Calc的类似实例吗? System.out如何不是NullPointerException?
要清楚,这不是关于NullPointerException的问题......这是一个关于为什么System.out不需要初始化的问题。
非常感谢!
答案 0 :(得分:2)
为什么System.out
不需要初始化?好吧......
在System
类的深处,有一个名为initializeSystemClass
的方法,JVM调用它。它会将System.out
设置为正确的值,因此您不必这样做。
请注意,System.out
不是PrintStream
的实例 - 它是PrintStream
实例的参考。
答案 1 :(得分:1)
您尚未_initialized calc
。你可以写了
static Calc calc = new Calc();
它会起作用(取决于Calc的定义)。
答案 2 :(得分:0)
正如@LouisWasserman所指出的,你的代码给出NPE的原因是你没有初始化calc
变量。因此,它会默认初始化到null
。解决方案:初始化它!
但更深层次的问题是为什么System.out
不需要初始化。这是因为Java运行时在后台将其初始化为指向引用应用程序(外部)标准输出的PrintStream。
System.out
,因为系统会执行此操作。 javadocs这样说。System.out
被声明为final
。 (但有System.setOut(...)
)System.setOut(...)
,应用程序也无法找出<{1}} 应设置为的内容。 (考虑这个System.out
)