我正在用Java构建一个使用BorderLayout的GUI程序。具体而言,它仅使用CENTER,PAGE_END和LINE_END区域。我有一个每个区域的课程,他们经常需要分享信息。我的主要课程和PAGE_END课程的开头是这样的:
public class JSudokuSolver extends JFrame {
protected static Dimension sBoardDim = new Dimension(500, 500);
protected static Dimension lineEndDim = new Dimension(200, 500);
protected static Dimension pageEndDim = new Dimension(650, 120);
...
public class PAGE_END_objs {
static Dimension pageEndDim = JSudokuSolver.pageEndDim;
...
有时这很好用;有时它不会。当它没有时,我在尝试使用' pageEndDim'时得到一个空指针(在这个例子中)。在PAGE_END_objs代码中。然后在Eclipse Neon调试模式下,如果我将鼠标悬停在' JSudokuSolver.pageEndDim'上,我会看到Dimension数据。但是,如果我将鼠标悬停在&page 39&page 39上,我会看到' null'。
对我来说,看起来静态作业还没有发生。是/否?如果是,它何时发生,是什么触发它?如果不是,我希望你有帮助信息吗? TIA!
答案 0 :(得分:2)
在符合Java的运行时环境中,任何使用该类的代码都可以访问它们之前,类的static
变量将被完全初始化。
如果您正在获取访问pageEndDim
的NPE,则某些内容会在加载类之后将null
分配给pageEndDim
。您可以考虑制作这些变量final
。
*如果初始化程序相互依赖或者你有static
初始化程序块执行init,它会有点复杂,但这不是这种情况。
答案 1 :(得分:0)
当类加载器加载类时,将初始化静态字段。此时会分配默认值。在初始化任何实例变量之前,将首先初始化这些变量。