这是我班的构造函数。使用以下代码:

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


一切顺利 。但是有了这段代码,

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

}


我得到以下例外:

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)


为什么会这样呢?

最佳答案

如果不看其余的代码(尤其是initComponents的定义以及字段的定义),就不可能100%确定。

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

显然,一种解决方法是保留所有内容,也许要添加评论

// Note - this method call initialises the fields.  DO NOT REORDER!!!


但是更好的解决方案是让编译器为您检查这些事情。如果这两个字段从未更改过(即在构造函数中一劳永逸地设置了它们),那么可以并且可以说应该将它们声明为final。除了让其他人非常清楚,他们不必考虑这些字段发生更改的可能性之外,这还意味着它们最初不会分配默认值,并且编译器不允许您在引用它们之前取消引用它们。被分配。

09-27 00:38
查看更多