2016-12-05 77 views
0

當我嘗試調用方法參數中的布爾數組時,我在我的程序中出現nullPointerException。布爾數組被創建爲常量,然後在單獨的void方法中初始化。有人可以向我解釋爲什麼它找不到布爾數組(或無法找到數組值)?如何初始化數組以避免空指針異常?

public static void moveTarget(Graphics g) { 
    if (!targetMovement) 
    return; 
    drawTarget(g, BACKGROUND_COLOR); 
    drawShield(g, BACKGROUND_COLOR); 

這條線就在這裏是程序失敗的具體部分。 (nullPointerException)

int f = findTargetMissilePosition(targetMissileActive); 

我在這裏指定常量,但不要初始化。

 // Target Missile values 
    public static Color TARGET_MISSILE_COLOR = TARGET_COLOR; 
    public static int MAX_MISSILES = 10; 
    public static double TARGET_MISSILE_SPEED = MISSILE_SPEED; 
    public static double TARGET_SHOOT_PROBABILITY = .1; 
    public static double[] targetMissilePositionX; 
    public static double[] targetMissilePositionY; 
    public static double[] targetMissileDeltaX; 
    public static double[] targetMissileDeltaY; 
    public static boolean[] targetMissileActive; 

    // main method does initialization and calls startGrame 
    public static void main(String[] args) { 
     DrawingPanel panel = new DrawingPanel(PANEL_WIDTH, PANEL_HEIGHT); 
     Graphics g = panel.getGraphics(); 
     initialize(); 
     startGame(panel, g); 

} //初始化()被調用以上是其中陣列intialized

// start the main game loop which runs forever 
    public static void startGame(DrawingPanel panel, Graphics g) { 
     while(true) { 
      panel.sleep(SLEEP_TIME); 
      handleKeys(panel,g); 
      moveTarget(g); 
      drawAll(g); 
      moveMissile(g); 
      shootTargetMissile(g); 
      for (int i=0;i<10;i++) { 
      int f = findTargetMissilePosition(targetMissileActive); 
      moveTargetMissile(g, f); 
    } 
      shieldHitTimer--; 
      targetHitTimer--; 
      shooterHitTimer--; 
    } 

} //上述是第一次的代碼行出現和不出現有問題。

// reset all parameters to start over 
    public static void reset(Graphics g) { 
     g.setColor(BACKGROUND_COLOR); 
     g.fillRect(0,0,PANEL_WIDTH,PANEL_HEIGHT); 
     initialize(); 

}

//Here the arrays are initialized 
    // initialize parameters for the start of the program 
    public static void initialize() { 
    shooterPositionX = SHOOTER_INITIAL_POSITION_X; 
    gunAngle = 0; 
    targetPositionX = PANEL_WIDTH/2; 
    missileActive = false; 
    hitCount = 0; 
    shooterHitCount = 0; 
    hitDisplayString = "Hits: "; 
    targetDeltaX = 0; 
    targetHitTimer = 0; 
    shieldHitTimer = 0; 
    shooterHitTimer = 0; 
    boolean [] targetMissileActive = new boolean [9]; // might change?? 
    int [] targetMissilePositionX = new int [9]; 
    int [] targetMissilePositionY = new int [9]; 
    int [] targetMissileDeltaX = new int [9]; 
    int [] targetMissileDeltaY = new int [9]; 
    for (int i=0; i<9; i++) { 
    targetMissilePositionX[i] = 0; 
    targetMissilePositionY[i] = 0; 
    targetMissileDeltaX[i] = 0; 
    targetMissileDeltaY[i] = 0; 
    targetMissileActive[i] = false; 
} 

}

 // draw everything in its current position 
    public static void drawAll(Graphics g) { 
    g.setColor(Color.BLACK); 
    g.drawString("Project 3 by Benjamin Koch",10,15); 
    g.drawString(hitDisplayString,10,30); 

    int f = findTargetMissilePosition(targetMissileActive); 
    drawTargetMissile(g, TARGET_MISSILE_COLOR, f); 
    drawShooter(g,SHOOTER_COLOR); 
    if (targetHitTimer > 0) 
    drawTarget(g, SHIELD_HIT_COLOR); 
    else 
    drawTarget(g,TARGET_COLOR); 
    Color shieldColor = BACKGROUND_COLOR; // default: do not draw 
    if (shieldActive) { 
    if (shieldHitTimer > 0) 
     shieldColor = SHIELD_HIT_COLOR; 
    else 
     shieldColor = SHIELD_COLOR; 
    } 
    drawShield(g, shieldColor); 

}

 public static int findTargetMissilePosition (boolean[] data) { 
    for (int i=0;i<MAX_MISSILES;i++) { 
    if (data[i]==false) { 
     return i; 
    } 
    } 
    return -1; 

} 
+1

你正在初始化一個局部變量,其名稱與靜態全局變量不同。要解決這個問題,你可能想把它改成像「ClassName.targetMissilesActive = new boolean [9]」等等。 – Steven

+0

我試圖初始化布爾數組(並且我把它寫成了整數和新數組)。謝謝! – TheAeroHead

+0

初始化靜態字段的一個很好的做法是創建一個靜態塊。 http://beginnersbook.com/2013/04/java-static-class-block-methods-variables/以供參考。 – Steven

回答

0

裏面你initialize()功能,你創建的局部變量,但沒有初始化的全局對象。

targetMissileActive = new boolean [9]; 
    targetMissilePositionX = new int [9]; 
    targetMissilePositionY = new int [9]; 
    targetMissileDeltaX = new int [9]; 
    targetMissileDeltaY = new int [9]; 
    for (int i=0; i<9; i++) { 
    targetMissilePositionX[i] = 0; 
    targetMissilePositionY[i] = 0; 
    targetMissileDeltaX[i] = 0; 
    targetMissileDeltaY[i] = 0; 
    targetMissileActive[i] = false; 
} 

這將引用變量到全局變量。