有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    因为jTextArea6jEditorPane1正在由initComponents初始化。在此之前您无法访问它们-它们为空。这就是为什么你会有例外

  2. # 2 楼答案

    因为在initComponents()中;你可以安装 jTextArea6绝地武士团1

  3. # 3 楼答案

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

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

    显然,一个解决办法是让事情保持原样,也许是加上一句评论

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

    但更好的解决方案是让编译器为您检查这些内容。如果这两个字段从未更改(即,它们在构造函数中被一次性设置),那么您可以并且可以说应该声明它们final。除此之外,对于其他人来说,他们不必考虑这些字段改变的可能性,这意味着它们不会初始赋值,编译器不会让它们在被赋值之前取消引用。p>

  4. # 4 楼答案

    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. # 5 楼答案

    在initcomponents中,这些对象是如何创建的?因此,它应该被称为第一

  6. # 6 楼答案

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