在某种背景下,我正在开发一个小行星游戏
所以,我的Asteroid是一个多边形(Java内置对象),而子弹只是一个点。当我试图探测小行星和子弹之间的碰撞时,我用的是带有子弹坐标的Polygon.contains(x,y)。但是由于某些原因,我在使用这种方法时得到了NullPointerException,但是我只得到异常--有时99%的情况下一切都很完美,然后我就得到了这个异常。当我射出一颗子弹时,我得到了一个异常,如果抛出了异常,子弹就会停止(子弹是一个线程,所以线程就死了)。
以下是相关代码:
for (int i = 0; i <= Math.ceil(l); i++) {
try {
t = i / (l - extension);
y = (int) ((t * (cursorPos.y - initY)) + initY);
x = (int) ((t * (cursorPos.x - initX)) + initX);
if (!PlayerPanel.meteorList.isEmpty()) {
synchronized (PlayerPanel.meteorList) {
for (int j = 0; j < PlayerPanel.meteorList.size(); j++) {
if (PlayerPanel.meteorList.get(j).shapes[PlayerPanel.meteorList.get(j).selectedMeteor].contains(x, y)) { // Line 39
PlayerPanel.meteorList.get(j).shapes[PlayerPanel.meteorList.get(j).selectedMeteor].invalidate();
PlayerPanel.playerScore+=10;
PlayerPanel.scoreLabel.setText("Score: " + PlayerPanel.playerScore);
synchronized (PlayerPanel.bulletList) {
PlayerPanel.bulletList.remove(this);
}
PlayerPanel.meteorList.remove(PlayerPanel.meteorList.get(j));
return;
}
}
}
}
TimeUnit.NANOSECONDS.sleep(1);
} catch (InterruptedException e) {
e.printStackTrace();
}小行星被储存在一个列表中,子弹也是如此。
例外情况:
Exception in thread "Thread-2" java.lang.NullPointerException
at java.desktop/java.awt.Polygon.getBoundingBox(Polygon.java:335)
at java.desktop/java.awt.Polygon.contains(Polygon.java:398)
at java.desktop/java.awt.Polygon.contains(Polygon.java:364)
at Bullet.run(Bullet.java:39)发布于 2021-12-25 12:08:52
如果PlayerPanel.meteorList或PlayerPanel.bulletList不是线程安全集合(如向量),请考虑使用Collections.synchronizedList:
List list = Collections.synchronizedList(new ArrayList(...));
synchronized(list){
//...
}https://stackoverflow.com/questions/70479852
复制相似问题