Java 按下重置按钮后出现空点异常。(处理)
我正在尝试为这个程序做一个重置按钮,我到处都找过了,我找不到一个有效的方法。我试着让它在游戏结束时,当你输了,你按下“重新启动”,游戏将从草图开始。该程序运行良好,但一旦你按下重启按钮,我会在控制台区域出现NullPointerException错误,游戏无法重启。我在“if(!drop[I].finished){”行中得到NullPointerException错误。我读到它与构造函数没有初始化数组有关,但它已经初始化了数组。这与重置按钮和构造函数没有重新初始化数组有关吗?还是其他原因?我不知道为什么,但它很少起作用,但所有文本都移到左边,并从屏幕上消失。比谢谢你的帮助Java 按下重置按钮后出现空点异常。(处理),java,arrays,if-statement,nullpointerexception,processing,Java,Arrays,If Statement,Nullpointerexception,Processing,我正在尝试为这个程序做一个重置按钮,我到处都找过了,我找不到一个有效的方法。我试着让它在游戏结束时,当你输了,你按下“重新启动”,游戏将从草图开始。该程序运行良好,但一旦你按下重启按钮,我会在控制台区域出现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();
}