【问题标题】:How to initialize an array to avoid a Null Pointer Exception?如何初始化数组以避免空指针异常?
【发布时间】:2016-12-05 22:38:17
【问题描述】:

当我尝试在方法参数中调用布尔数组时,我的程序中出现 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);

} //initialize() 在上面调用,这是初始化数组的地方

    // 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;

}

【问题讨论】:

  • 您正在使用与静态全局变量不同的名称在内部初始化一个局部变量。要解决此问题,您可能需要将其更改为“ClassName.targetMissilesActive = new boolean[9]”等。
  • 我试图初始化布尔数组(我把它写成整数和新数组)。谢谢!
  • 初始化静态字段的一个好习惯是创建一个静态块。 beginnersbook.com/2013/04/…供参考。

标签: java arrays nullpointerexception


【解决方案1】:

在您的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;
}

这会将变量引用到全局变量。

【讨论】:

    猜你喜欢
    • 2011-10-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-09
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 2015-05-07
    • 2019-04-24
    相关资源
    最近更新 更多