Java 按下重置按钮后出现空点异常。(处理)

Java 按下重置按钮后出现空点异常。(处理),java,arrays,if-statement,nullpointerexception,processing,Java,Arrays,If Statement,Nullpointerexception,Processing,我正在尝试为这个程序做一个重置按钮,我到处都找过了,我找不到一个有效的方法。我试着让它在游戏结束时,当你输了,你按下“重新启动”,游戏将从草图开始。该程序运行良好,但一旦你按下重启按钮,我会在控制台区域出现NullPointerException错误,游戏无法重启。我在“if(!drop[I].finished){”行中得到NullPointerException错误。我读到它与构造函数没有初始化数组有关,但它已经初始化了数组。这与重置按钮和构造函数没有重新初始化数组有关吗?还是其他原因?我不知

我正在尝试为这个程序做一个重置按钮,我到处都找过了,我找不到一个有效的方法。我试着让它在游戏结束时,当你输了,你按下“重新启动”,游戏将从草图开始。该程序运行良好,但一旦你按下重启按钮,我会在控制台区域出现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;
  }
}

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

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

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

您已经初始化了数组
drops=newdrop[50];
,但没有填充任何内容,因此所有元素都是
null
听起来你可能有一个多线程竞争条件,也就是说,当你重置状态时,游戏试图同时更新视图,导致像这样的神秘崩溃,有时……对不起,我是一个业余玩家所以你能告诉我如何填充数组使其不为空吗?顺便说一句,非常感谢你的帮助非常感谢!现在我只需要使它在我重新启动时不会下降50滴,但我可以找出,这只是一个逻辑错误!再次感谢,这让我很长时间感到困扰!
// Check the timer
if (timer.isFinished()) {
  if (totalDrops < drops.length) {
    drops[totalDrops] = new Drop(); 

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