首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Polygon.contains()抛出NullPointerException

Polygon.contains()抛出NullPointerException
EN

Stack Overflow用户
提问于 2021-12-25 11:56:00
回答 1查看 55关注 0票数 0

在某种背景下,我正在开发一个小行星游戏

所以,我的Asteroid是一个多边形(Java内置对象),而子弹只是一个点。当我试图探测小行星和子弹之间的碰撞时,我用的是带有子弹坐标的Polygon.contains(x,y)。但是由于某些原因,我在使用这种方法时得到了NullPointerException,但是我只得到异常--有时99%的情况下一切都很完美,然后我就得到了这个异常。当我射出一颗子弹时,我得到了一个异常,如果抛出了异常,子弹就会停止(子弹是一个线程,所以线程就死了)。

以下是相关代码:

代码语言:javascript
复制
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();
            }

小行星被储存在一个列表中,子弹也是如此。

例外情况:

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

发布于 2021-12-25 12:08:52

如果PlayerPanel.meteorList或PlayerPanel.bulletList不是线程安全集合(如向量),请考虑使用Collections.synchronizedList:

代码语言:javascript
复制
 List list = Collections.synchronizedList(new ArrayList(...));
 
 synchronized(list){
       //...
 }
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/70479852

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档