2016-03-04 84 views
1

我想使用名爲molenum的變量訪問對象數組中的對象。但是,當我嘗試運行該程序時,我得到一個空指針異常。我隨機生成molenum,然後用它作爲數組的索引。任何想法,我要去錯了嗎?在java中使用變量訪問對象引用數組

下面是代碼初始化我的對象:

MoleButton[] molebuttons = new MoleButton[25]; 
    molebuttons[0] = new MoleButton(); 
    molebuttons[1] = new MoleButton(); 
    molebuttons[2] = new MoleButton(); 
    molebuttons[3] = new MoleButton(); 
    molebuttons[4] = new MoleButton(); 
    molebuttons[5] = new MoleButton(); 
    molebuttons[6] = new MoleButton(); 
    molebuttons[7] = new MoleButton(); 
    molebuttons[8] = new MoleButton(); 
    molebuttons[9] = new MoleButton(); 
    molebuttons[10] = new MoleButton(); 
    molebuttons[11] = new MoleButton(); 
    molebuttons[12] = new MoleButton(); 
    molebuttons[13] = new MoleButton(); 
    molebuttons[14] = new MoleButton(); 
    molebuttons[15] = new MoleButton(); 
    molebuttons[16] = new MoleButton(); 
    molebuttons[17] = new MoleButton(); 
    molebuttons[18] = new MoleButton(); 
    molebuttons[19] = new MoleButton(); 
    molebuttons[20] = new MoleButton(); 
    molebuttons[21] = new MoleButton(); 
    molebuttons[22] = new MoleButton(); 
    molebuttons[23] = new MoleButton(); 
    molebuttons[24] = new MoleButton(); 


    buttonSpace.add(molebuttons[0]); 
    buttonSpace.add(molebuttons[1]); 
    buttonSpace.add(molebuttons[2]); 
    buttonSpace.add(molebuttons[3]); 
    buttonSpace.add(molebuttons[4]); 
    buttonSpace.add(molebuttons[5]); 
    buttonSpace.add(molebuttons[6]); 
    buttonSpace.add(molebuttons[7]); 
    buttonSpace.add(molebuttons[8]); 
    buttonSpace.add(molebuttons[9]); 
    buttonSpace.add(molebuttons[10]); 
    buttonSpace.add(molebuttons[11]); 
    buttonSpace.add(molebuttons[12]); 
    buttonSpace.add(molebuttons[13]); 
    buttonSpace.add(molebuttons[14]); 
    buttonSpace.add(molebuttons[15]); 
    buttonSpace.add(molebuttons[16]); 
    buttonSpace.add(molebuttons[17]); 
    buttonSpace.add(molebuttons[18]); 
    buttonSpace.add(molebuttons[19]); 
    buttonSpace.add(molebuttons[20]); 
    buttonSpace.add(molebuttons[21]); 
    buttonSpace.add(molebuttons[22]); 
    buttonSpace.add(molebuttons[23]); 
    buttonSpace.add(molebuttons[24]); 

這裏就是我試圖通過數組訪問它們。

int molecount = 0; 
     int molenum; 
     Random rand = new Random(); 
     int i; //loop counter 

     do 
     { 
      MoleButton.wait(500); 
      while(true) { 
       molenum = rand.nextInt(25); 
       if(molebuttons[molenum].isAMole() == false) 
       { 
        molebuttons[molenum].setIsMole(true); 
        break; 
       } 
      } 

堆棧跟蹤爲:

Exception in thread "main" java.lang.NullPointerException 
    at CW3.MoleButton.main(MoleButton.java:128) 

與線128的存在:

if(molebuttons[molenum].isAMole() == false) 

爲類完整的源代碼:

package CW3; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.GridLayout; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.util.Random; 

import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 

public class MoleButton extends ColorButton { 

    private Boolean currentlyIsMole; 

    public static void main(String[] args) 
    { 

     //Create GUI 
     JFrame guiWindow = new JFrame(); 
     guiWindow.setVisible(true); 
     guiWindow.setTitle("Jack Nicholson"); 
     guiWindow.setLayout(new BorderLayout()); 
     guiWindow.pack(); 

     JPanel topBar = new JPanel(); 
     JPanel buttonSpace = new JPanel(); 
     guiWindow.add(topBar,BorderLayout.NORTH); 
     guiWindow.add(buttonSpace,BorderLayout.SOUTH); 

     //GUI: topbar 
     topBar.setLayout(new GridLayout(1,5)); 

     JLabel label1 = new JLabel(); 
     JLabel label2 = new JLabel(); 
     JLabel label3 = new JLabel(); 
     JLabel label4 = new JLabel(); 
     JLabel label5 = new JLabel(); 

     topBar.add(label1); 
     topBar.add(label2); 
     topBar.add(label3); 
     topBar.add(label4); 
     topBar.add(label5); 

     //GUI:button space 
     buttonSpace.setLayout(new GridLayout(5,5)); 

     MoleButton[] molebuttons = new MoleButton[25]; 
     molebuttons[0] = new MoleButton(); 
     molebuttons[1] = new MoleButton(); 
     molebuttons[2] = new MoleButton(); 
     molebuttons[3] = new MoleButton(); 
     molebuttons[4] = new MoleButton(); 
     molebuttons[5] = new MoleButton(); 
     molebuttons[6] = new MoleButton(); 
     molebuttons[7] = new MoleButton(); 
     molebuttons[8] = new MoleButton(); 
     molebuttons[9] = new MoleButton(); 
     molebuttons[10] = new MoleButton(); 
     molebuttons[11] = new MoleButton(); 
     molebuttons[12] = new MoleButton(); 
     molebuttons[13] = new MoleButton(); 
     molebuttons[14] = new MoleButton(); 
     molebuttons[15] = new MoleButton(); 
     molebuttons[16] = new MoleButton(); 
     molebuttons[17] = new MoleButton(); 
     molebuttons[18] = new MoleButton(); 
     molebuttons[19] = new MoleButton(); 
     molebuttons[20] = new MoleButton(); 
     molebuttons[21] = new MoleButton(); 
     molebuttons[22] = new MoleButton(); 
     molebuttons[23] = new MoleButton(); 
     molebuttons[24] = new MoleButton(); 


     buttonSpace.add(molebuttons[0]); 
     buttonSpace.add(molebuttons[1]); 
     buttonSpace.add(molebuttons[2]); 
     buttonSpace.add(molebuttons[3]); 
     buttonSpace.add(molebuttons[4]); 
     buttonSpace.add(molebuttons[5]); 
     buttonSpace.add(molebuttons[6]); 
     buttonSpace.add(molebuttons[7]); 
     buttonSpace.add(molebuttons[8]); 
     buttonSpace.add(molebuttons[9]); 
     buttonSpace.add(molebuttons[10]); 
     buttonSpace.add(molebuttons[11]); 
     buttonSpace.add(molebuttons[12]); 
     buttonSpace.add(molebuttons[13]); 
     buttonSpace.add(molebuttons[14]); 
     buttonSpace.add(molebuttons[15]); 
     buttonSpace.add(molebuttons[16]); 
     buttonSpace.add(molebuttons[17]); 
     buttonSpace.add(molebuttons[18]); 
     buttonSpace.add(molebuttons[19]); 
     buttonSpace.add(molebuttons[20]); 
     buttonSpace.add(molebuttons[21]); 
     buttonSpace.add(molebuttons[22]); 
     buttonSpace.add(molebuttons[23]); 
     buttonSpace.add(molebuttons[24]); 

     //Game loop 

     int molecount = 0; 
     int molenum; 
     Random rand = new Random(); 
     int i; //loop counter 

     do 
     { 
      MoleButton.wait(500); 
      while(true) { 
       molenum = rand.nextInt(25); 
       if(molebuttons[molenum].isAMole() == false) 
       { 
        molebuttons[molenum].setIsMole(true); 
        break; 
       } 
      } 

      //Gameloop:count moles 

      for(i=0;i <= 24;i++) 
      { 
       if(molebuttons[i].isAMole() == true) 
       { 
        molecount++; 
       } 
      } 


     }while(molecount <= 8); 



    } 


    public MoleButton() { 
     super(100, 100, Color.RED, 10, Color.BLACK); 
     this.addActionListener(new ClickMole(this)); 
     // Constructor 
    } 

    public Boolean isAMole() 
    { 
     return currentlyIsMole; 
    } 

    public synchronized void setIsMole (Boolean isMole) 
    { 
     //If true set to mole, if false set to normal button 
     if(isMole == true) 
     { 
      currentlyIsMole = true; 
      super.setColor(Color.RED); 
     } 
     else 
     { 
      currentlyIsMole = false; 
      super.setColor(Color.GREEN); 

     } 
    } 

    public static void wait(int milliseconds) 
    { 
     try 
     { 
      Thread.sleep(milliseconds); 
     } 
     catch(InterruptedException e) 
     { 
      System.out.println(e); 
     } 
    } 

    public class ClickMole implements ActionListener { 

     //Event listener for MoleButton 

     MoleButton moleB; 

     public ClickMole(MoleButton mole) 
     { 
      moleB = mole; 
     } 

     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      if (moleB.currentlyIsMole == true) 
       moleB.setIsMole(false); 
     } 



    } 

} 
+1

可能重複[什麼是空指針異常,以及如何解決它?](http://stackoverflow.com/questions/218384/what-is-a-null-pointer-exception-and-how -do-i-fix-it) – radoh

+1

你在哪一行得到NPE? – bradimus

回答

1

當創建一個Array在Java中,每個元素都被初始化爲 空值。你需要用實例自己填充數組。

現在您已經添加了源代碼,問題與布爾值相同,即可爲空的對象,如果未初始化則爲空。 Java會自動將布爾(對象)轉換爲布爾(原始),如果布爾值爲空,則會失敗。

因此,將布爾值更改爲布爾值,除非真的沒有初始化是相關的。

+0

我已經在函數中初始化了這些對象,甚至在它們上面都使用了一個函數,所以我確信它們已經初始化了。我剛剛編輯我的帖子來反映這一點。 –

+0

是異常,然後不isAMole?提供堆棧跟蹤。 –

+0

已添加堆棧跟蹤 –

0

我想你已經忘了初始化buttonSpace ..保持一切看起來不錯。 你得到了什麼行nullpointer?

+0

我已經在函數中初始化了buttonSpace。這些按鈕出現在我創建的GUI中,但是特定的循環是我遇到問題的地方。 –

+0

你可以發佈完整的主要方法嗎?我在這裏沒有看到任何可能的空指針,除非我經歷完整的代碼。 –

+0

添加完整的源代碼 –