这是我班级的构造者.使用以下代码:
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)
为什么会这样?
在没有看到其余代码(initComponents
特别是定义,加上字段的定义)的情况下,不可能100%确定.
但几乎肯定是该initComponents()
方法设置jTextArea6
和/或的值jEditorPane1
.在第二个示例中,您尝试在设置之前取消引用这些字段; 这意味着它们具有默认值null
,因此当您尝试在它们上调用方法时会导致抛出NullPointerException.
显然,一个解决办法就是保留原样,也许是评论说明
// Note - this method call initialises the fields. DO NOT REORDER!!!
Run Code Online (Sandbox Code Playgroud)
但更好的解决方案是让编译器为您检查这些内容.如果两个字段永远不改变(即他们建立一劳永逸的构造函数中),那么你就可以和按理说应该申报他们final
.除了这个是别人说他们没有考虑这些领域变化的可能性非常明确,这意味着他们不会有最初分配的默认值,而编译器不会让你解引用他们,他们之前已经已被分配.