2012-07-19 129 views
1

下面是我的程序界面的图片,仅为解释我的问题时的简单性。 Interface of my program空指针在JTextPane中编辑文本时出现异常

所以程序与此屏幕开始,第一步是编辑您的姓名,单击编辑名字按钮,它会调用这个方法:

private void editName() { 
    NameLabel = new javax.swing.JLabel(); 
    NameField = new javax.swing.JTextField(); 
    Sumbit = new javax.swing.JButton(); 
    Sumbit.addActionListener(this); 

    setDefaultCloseOperation(javax.swing.WindowConstants.DISPOSE_ON_CLOSE); 
    setAlwaysOnTop(true); 
    setType(java.awt.Window.Type.POPUP); 

    NameLabel.setText("Name:"); 
    NameField.setText(name); 
    Sumbit.setText("Sumbit"); 
    ..location code.. 

所以你在文本输入您的姓名字段弹出,然后你点击提交。然后,我得到这个错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException 
at kraz.Kraz.game(Kraz.java:62) 
at kraz.Kraz.actionPerformed(Kraz.java:186) 

的actionPerformed上线186提交按钮:

 else if (e.getSource() == Sumbit) 
    { 
     name = NameField.getText(); 
     NameField.setText("" + name); 

     if (step == 1) 
     { 
      ++step; 
      game(); 
     } 
    } 

62行是我所谓的游戏()方法。下一个162行是:

public void game() { 
    if (step == 1) 
    { 
     HealthBar.setValue(100); 
    } 
    else if (step == 2) 
    { 
     EventField.setText("Test"); 
     ProgressBar.setValue(1); 
    } 
} 

和错误是当我在EventField中设置文本。

全码:http://pastebin.com/rBWju8vX

+0

是'EventField'初始化?这是堆栈跟踪中指出的唯一可以在行62上为空的东西。 – 2012-07-19 01:15:25

+0

它在initComponents()中初始化。 – jrad 2012-07-19 01:17:33

回答

7

你有2个构造函数,调用一个和initComponents()另一个不:

public Kraz() { 
    initComponents(); 
    setVisible(true); 
    game(); 
} 

public Kraz(String check) { 
    if (check.equals("editName")) 
    { 
     editName(); 
     setVisible(true); 
    } 
} 

在main方法,你叫new Kraz();这是调用initComponents()之一。但是,当你处理EditName事件,您再次调用构造函数,但另外一个,new Kraz("editName"),这不叫initComponents()所以EventField为空:

else if (e.getSource() == EditName) 
{ 
    new Kraz("editName"); 
} 

所以,当在Kraz这个新的实例,你点击“提交”按钮,新实例处理事件并调用game(),除了没有任何字段已经被初始化。

+0

这只是我的错误编码,我做的是第一个是主要的,第二个构造函数创建弹出窗口,即编辑名称窗口 – RipIt 2012-07-19 01:42:22

+1

您应该调用this();在第二个构造函数中。这将缓解重新编码第一个构造函数正在做什么的需要。 – MadProgrammer 2012-07-19 01:47:50

+0

我很困惑我会调用this()方法。是否会创建Kraz的新实例?如果是这样,我该怎么做? – RipIt 2012-07-19 02:25:07

0

呼叫this()在第二个构造函数:

public Kraz() { 
    initComponents(); 
    setVisible(true); 
    game(); 
} 

public Kraz(String check) { 

    this(); // <-- Add here 

    if (check.equals("editName")) 
    { 
     editName(); 
     setVisible(true); 
    } 
} 
+0

说加入'this()'引起了一堆错误。如果@RipIt真的想为编辑名称窗口重新使用Kraz类,只需在'editName()'中实例化一个'EventField',其中一堆其他字段被初始化。 – 2012-07-19 05:13:05

+0

这是因为未调用this()意味着已访问的组件未被初始化,从而导致空指针异常。 – MadProgrammer 2012-07-19 09:38:42