gpt4 book ai didi

java - 按下重置按钮后出现 NullPointerException。 (加工)

转载 作者:行者123 更新时间:2023-12-01 12:16:05 24 4
gpt4 key购买 nike

我正在尝试为这个程序制作一个重置按钮,我到处都找过了,但找不到有效的方法。我试图在游戏结束时,当你输了时,你按“重新启动”,游戏将从草图的开头开始。该程序工作正常,但一旦按下“重新启动”按钮,我会在控制台区域收到 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)

最佳答案

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

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

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

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

在您的设置方法中,添加以下内容以确保您的数组填充有非空值:

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

关于java - 按下重置按钮后出现 NullPointerException。 (加工),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27008414/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com