为什么我在这里得到例外?

sap*_*Pro 0 java

这是我班级的构造者.使用以下代码:

public tester {
    setTitle("tester");
    initComponents();
    jTextArea6.setEditable(false);
    jEditorPane1.setEditable(false);
}
Run Code Online (Sandbox Code Playgroud)

一切都好 .但是使用此代码,

public tester() {
    setTitle("tester");
    jTextArea6.setEditable(false);
    jEditorPane1.setEditable(false);
    initComponents();

}
Run Code Online (Sandbox Code Playgroud)

我得到以下例外情况:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at tester.tester.<init>(tester.java:31)
at tester.tester$35.run(tester.java:1389)
at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:251)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:660)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:211)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:128)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:117)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:113)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:105)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
Run Code Online (Sandbox Code Playgroud)

为什么会这样?

And*_*yle 7

在没有看到其余代码(initComponents特别是定义,加上字段的定义)的情况下,不可能100%确定.

但几乎肯定是该initComponents()方法设置jTextArea6和/或的值jEditorPane1.在第二个示例中,您尝试在设置之前取消引用这些字段; 这意味着它们具有默认值null,因此当您尝试在它们上调用方法时会导致抛出NullPointerException.

显然,一个解决办法就是保留原样,也许是评论说明

// Note - this method call initialises the fields.  DO NOT REORDER!!!
Run Code Online (Sandbox Code Playgroud)

但更好的解决方案是让编译器为您检查这些内容.如果两个字段永远不改变(即他们建立一劳永逸的构造函数中),那么你就可以和按理说应该申报他们final.除了这个是别人说他们没有考虑这些领域变化的可能性非常明确,这意味着他们不会有最初分配的默认值,而编译器不会让你解引用他们,他们之前已经已被分配.