基本上,我有一个基本的碰撞检测方法,有时当我运行applet时,它可以工作,但大部分时间它都可以。这是错误和一些代码:
Exception in thread "Thread-3" java.lang.NullPointerException
at zombies.Main.checkCollision(Main.java:110)
at zombies.Main.run(Main.java:140)
at java.lang.Thread.run(Unknown Source)
public void checkCollision(){
if(player.playerRect.intersects(platform.platformRect)){ // line 110
player.dy = 0;
player.y = (platform.y - player.height);
player.isTouching = true;
}
....
@Override
public void run() {
try {
while(true){
checkCollision(); // line 140
player.move();
Thread.sleep(15);
非常感谢任何帮助!提前谢谢!
答案 0 :(得分:1)
答案是player
,player.playerRect
或platform
为null
。
您需要将它们分解为单独的检查以确定哪一个为空(或者在调试器中使用断点停止)。
要分开检查,您的代码将如下所示:
if (player == null) {
throw new NullPointerException("player is null");
}
if (player.playerRect == null) {
throw new NullPointerException("player.playerRect is null");
}
if (platform == null) {
throw new NullPointerException("platform is null");
}
这将允许您查看异常以确定哪个对象为null
。然后,您可以检查代码以找出有时将该对象设置为null的原因,并修复该情况。
或者,不是抛出NullPointerException
,而是绕过代码的那一部分,因为它可能对对象有效null
。
也就是说,如果您正在处理多个线程,并且有时只会出现问题,那么您应该查看Java的锁定,同步和其他并发工具。否则,您可能会遇到一个线程检查对象是否为null
的情况,但在该比较之后以及在有机会对该结果执行操作之前,另一个线程会更改该对象。
想象一下这一系列事件:
player
不是null
player
替换null
player
不是null
,尝试访问其playerRect
成员,但现在是{{1} },它被抛出null