2012-07-19 122 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