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

时间:2011-07-25 09:04:36

标签: java

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

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)

为什么会这样?

6 个答案:

答案 0 :(得分:7)

如果没有看到其余代码(特别是initComponents的定义,加上字段的定义),就不可能100%确定。

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

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

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

但更好的解决方案是让编译器为您检查这些内容。如果两个字段都没有改变(即它们在构造函数中被一次性设置),那么你可以并且可以说它们应该声明它们final。除了这一点之外,他们非常清楚他们不必考虑这些字段发生变化的可能性,这意味着他们不会在最初分配默认值,并且编译器不会让你在它们出现之前取消引用它们被分配了。

答案 1 :(得分:4)

jTextArea6初始化jEditorPane1initComponents。在此之前您无法访问它们 - 它们为空。这就是你得到例外的原因。

答案 2 :(得分:0)

在initcomponents中创建了这些对象?因此,应首先调用它?

答案 3 :(得分:0)

因为在initComponents()中;你设置了jTextArea 6 jEditorPane 1

的对象

答案 4 :(得分:0)

public tester() {
  setTitle("tester");
  jTextArea6.setEditable(false);  //jTextArea6 might be null
  jEditorPane1.setEditable(false); //jEditorPane1 might be null
  initComponents(); //I assume you're creating your components here, thus jTextArea6 and jEditorPane1 would be non-null after this line only
}

答案 5 :(得分:0)

很可能因为方法initComponents()初始化变量jTextArea6和/或jEditorPane1。在初始化之前调用方法是抛出NullPointerException