按下重置按钮后出现NullPointerException。 (处理)对

时间:2014-11-19 03:23:37

标签: java arrays if-statement nullpointerexception processing

我正在尝试为这个程序制作一个重置按钮,我到处寻找,我找不到一个有效的方法。我试图在游戏结束时这样做,当你输了,你按“重新启动”游戏将从草图的开头开始。该程序工作正常但是一旦你按下Restart按钮,我在控制台区域出现NullPointerException错误,游戏不会重启。我在“if(!drop [i] .finished){”行中得到NullPointerException错误。我已经读过它与构造函数没有初始化数组有关,但它已经初始化了它。这是否与重置按钮和构造函数没有重新初始化数组有关,还是其他什么?我不知道为什么,但很少有人工作,但是所有的文字都转移到了左边,它离开了屏幕。谢谢你的帮助。

boolean button = false;
Catcher catcher;    
Timer timer;        
Drop[] drops;      
int totalDrops = 0; 
int x = 200;
int y = 100;
int w = 150;
int h = 60;

// Is the game over?
boolean gameOver = false;

// Variables for score level lives and level counter
int score = 0;     
int level = 1;      
int lives = 10;     //10 lives per level, resets at next level
int levelCounter = 0;

PFont f;
void reset() {
  score = 0;
  level = 1;
  levelCounter = 0;
  lives = 10;
  timer.setTime(constrain(300-level*25,0,300));
  totalDrops = 0; 
  gameOver = false;
  button = false;
}


void setup() {
  size(400,400);
  smooth();
  catcher = new Catcher(32);
  drops = new Drop[50];    
  timer = new Timer(300);   
  timer.start();  
  gameOver = false;  
  finished = false;
  level = 1;
  score = 0;


  f = createFont("Arial",12,true); 
}

void draw() {
  background(255);

  // If the game is over
  rectMode (CENTER);
  if (gameOver) {
    textFont(f,48);
    textAlign(CENTER);
    fill(0);
    text("GAME OVER",width/2,height/2);
    textFont(f,24);
    text("Your score was "+ score,200,225);
    textFont(f,16);
    text("You reached level "+ level,200,245);
    fill(255);
    stroke(0);
    rect(200,100,150,60);
    stroke(255);
    fill(0);
    textFont(f,20);
    text("Restart",200,107);


  } 
  else {

    // Set catcher location
    catcher.setLocation(mouseX,mouseY); 

    catcher.display(); 

    // Check the timer
    if (timer.isFinished()) {
      if (totalDrops < drops.length) {
        drops[totalDrops] = new Drop();

        totalDrops++;
      }
      timer.start();
    }

    // Move and display all drops
    for (int i = 0; i < totalDrops; i++ ) {


      if (!drops[i].finished) {

        drops[i].move();
        drops[i].display();
        if (drops[i].reachedBottom()) {
          levelCounter++;
          drops[i].finished(); 
          // If the drop reaches the bottom a live is lost and you lose 5 points
          lives--;
          score=score-5;
          // If lives reach 0 the game is over
          if (lives <= 0) {
            gameOver = true; 
          }
        } 

        // Everytime you catch a drop, the score goes up
        if (catcher.intersect(drops[i])) {
          drops[i].finished();
          levelCounter++;
          score=score+10;
        }
      }
    }


    // If all the drops are done, that level is over!
    if (levelCounter >= drops.length) {
      // Go up a level
      level++;
      // Reset all game elements
      levelCounter = 0;
      lives = 10;
      timer.setTime(constrain(300-level*25,0,300));
      totalDrops = 0; 
    }





    // Display number of lives left
    rectMode(CORNER);
    textFont(f,14);
    fill(0);
    text("Lives left: " + lives,10,20);
    rect(10,24,lives*10,10);

    text("Level: " + level,300,20);
    text("Score: " + score,300,40);
  }

if (mousePressed) {
  if (mouseX >= x && mouseX <= x + w && mouseY >= y && mouseY <= y + h && gameOver == true){
    setup();
  }
}
println();
}
//----------------------Drop Class-----------------------------
class Drop {
  float x,y;  
  float speed; 
  color c;
  float r;     

  //Is the drop used?
  boolean finished = false;

  Drop() {
    r = 8;               
    x = random(width);     
    y = -r*4;              
    speed = random(2,5);   
    c = color(random(255),random(255),random(255)); 
  }


  void move() {

    y += speed; 
  }

  // Check if it hits the bottom
  boolean reachedBottom() {
    // If it passes the bottom
    if (y > height + r*4) { 
      return true;
    } 
    else {
      return false;
    }
  }


  void display() {
    fill(c);
    noStroke();
    for (int i = 2; i < r; i++ ) {
      ellipse(x,y + i*4,i*2,i*2);
    }
  }

  // If the drop is caught
  void finished() {
    finished = true;
  }
}

这是堆栈跟踪:

Exception in thread "Animation Thread" java.lang.NullPointerException
    at Raindrop_Catcher.draw(Raindrop_Catcher.java:113)
    at processing.core.PApplet.handleDraw(Unknown Source)
    at processing.core.PApplet.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:662)

1 个答案:

答案 0 :(得分:1)

看起来你只是用if语句中的对象填充数组drops

// Check the timer
if (timer.isFinished()) {
  if (totalDrops < drops.length) {
    drops[totalDrops] = new Drop(); 

    totalDrops++;
  }
  timer.start();
}

因此,如果if语句的计算结果为false,则数组仍然填充空值,从而导致NullPointerException。在尝试使用它们之前,请确保该数组包含对象。

在你的setup方法中,添加它以确保你的数组填充了非空值:

for (int i = 0; i < drops.length; i++)
{
     drops[i] = new Drop();
}