【问题标题】:Polygon.contains() throws NullPointerExceptionPolygon.contains() 抛出 NullPointerException
【发布时间】:2022-01-25 11:54:13
【问题描述】:

一些上下文,我正在开发一个小行星游戏

所以,我的 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)

【问题讨论】:

    标签: java list thread-safety polygon synchronized


    【解决方案1】:

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

     List list = Collections.synchronizedList(new ArrayList(...));
     
     synchronized(list){
           //...
     }
    

    【讨论】:

    • 这太酷了,我不知道 - 但我正在使用 synchronize(),所以我想我会得到相同的结果(是吗?)
    • 我更新了示例,其中包括同步。不幸的是,在您的情况下,同步没有达到您的预期。
    • 哦,很高兴知道 :) 但是您能解释一下两者之间的区别吗?
    • 更新:刚刚再次遇到异常(我正在使用synchronizedList
    猜你喜欢
    • 2017-08-11
    • 2013-09-07
    • 2013-06-18
    • 2016-07-07
    • 2014-10-02
    • 2012-05-21
    • 2014-08-15
    • 2013-08-06
    • 2019-09-21
    相关资源
    最近更新 更多