1

谁能告诉我为什么下面的代码会抛出空指针异常?异常在行 numberJTextField.addMouseListener(new MyMouseAdapter(numberJTextField)); 在 InputJFrame1.java 类中。

import java.awt.*;

public class InputJFrame1 extends javax.swing.JFrame
{
    private javax.swing.JTextField numberJTextField;

    public InputJFrame1()
    {     
         numberJTextField.addMouseListener(new MyMouseAdapter(numberJTextField));
    }

    private void initComponents() 
    {
        numberJTextField = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        getContentPane().add(numberJTextField);
    }

    public static void main(String args[])
    {
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
        java.util.logging.Logger.getLogger(InputJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
        java.util.logging.Logger.getLogger(InputJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
        java.util.logging.Logger.getLogger(InputJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
        java.util.logging.Logger.getLogger(InputJFrame1.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }

        java.awt.EventQueue.invokeLater(new Runnable()
                                    {
                                        @Override
                                        public void run()
                                        {
                                            new InputJFrame1().setVisible(true);
                                        }
                                    });
    }
}



import java.awt.Color;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTextField;

public class MyMouseAdapter extends MouseAdapter
{
    private JTextField jTextField;

    MyMouseAdapter(JTextField jTextField)
    {
        this.jTextField=jTextField;
    }

    @Override
    public void mouseClicked(MouseEvent e)
    {
          jTextField.setForeground(Color.red);
    }
}

堆栈跟踪:

java.awt.event.InvocationEvent 的 javaapplication8.InputJFrame1$1.run(InputJFrame1.java:73) 的 javaapplication8.InputJFrame1.(InputJFrame1.java:9) 的线程“AWT-EventQueue-0”java.lang.NullPointerException 中的异常。 dispatch(InvocationEvent.java:251) at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:727) at java.awt.EventQueue.access$200(EventQueue.java:103) at java.awt.EventQueue$3.run(EventQueue .java:688) 在 java.awt.EventQueue$3.run(EventQueue.java:686) 在 java.security.AccessController.doPrivileged(Native Method) 在 java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76) 在java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242) 中的 java.awt.EventQueue.dispatchEvent(EventQueue.java:697)。EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161) at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146) at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread .java:138) 在 java.awt.EventDispatchThread.run(EventDispatchThread.java:91)

4

5 回答 5

4

不要initComponents从构造函数中删除。它确保在使用它们之前正确初始化所有组件,因此它应该是构造函数的第一行。

public InputJFrame1()
{     
     initComponents();
     numberJTextField.addMouseListener(new MyMouseAdapter(numberJTextField));
}
于 2013-07-15T09:49:58.583 回答
2

我认为您忘记numberJTextField在默认构造函数上初始化(和其他组件)

public InputJFrame1()
    {     
         initComponents();
         numberJTextField.addMouseListener(new MyMouseAdapter(numberJTextField));
    }
于 2013-07-15T09:50:03.443 回答
2

numberJTextField在调用构造函数时尚未分配该字段。initComponents在添加 MouseListener 之前,尝试在构造函数中调用该方法。

public class InputJFrame1 extends javax.swing.JFrame
{
    private javax.swing.JTextField numberJTextField;

    public InputJFrame1()
    {     
         initComponents(); //Init components before using textfield
         numberJTextField.addMouseListener(new MyMouseAdapter(numberJTextField));
    }

    private void initComponents() 
    {
        numberJTextField = new javax.swing.JTextField();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        getContentPane().add(numberJTextField);
    }
于 2013-07-15T09:50:16.980 回答
1
public InputJFrame1() {
        numberJTextField.addMouseListener(new MyMouseAdapter(numberJTextField));
    }

numberJTextField为空,这就是为什么。

于 2013-07-15T09:50:52.263 回答
0

您正在实例化一个 new InputJFrame1,但没有调用您的初始化方法,意思numberJTextField是 null。

我会把你的初始化代码放在你的构造函数中。然后,您可以将适当的字段标记为final,如果您忘记初始化它们,编译器会告诉您。

private final javax.swing.JTextField numberJTextField;

使用final是避免将来出现此类初始化问题的好方法。

于 2013-07-15T09:50:06.933 回答