这是我班的构造函数。使用以下代码:
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
。除了让其他人非常清楚,他们不必考虑这些字段发生更改的可能性之外,这还意味着它们最初不会分配默认值,并且编译器不允许您在引用它们之前取消引用它们。被分配。