基本上,我有一个基本的碰撞检测方法,有时当我运行小程序时,它会起作用,但大多数时候它不会起作用。这是错误和一些代码:
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);
非常感谢任何帮助!提前致谢!
最佳答案
答案是 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
s,您可以绕过这部分代码,因为对象 null
可能是有效的。 .
也就是说,如果您正在处理多个线程,并且该问题只是偶尔发生,那么您可能应该查看 Java 的锁定、同步和其他并发工具。否则,您可能会遇到这样一种情况:一个线程检查对象是否为null
。 ,但是在比较之后并且在它有机会对结果采取行动之前,另一个线程会更改该对象。
想象一下这一系列事件:
- 线程A检查并发现
player
不是null
- 线程B运行并替换
player
与null
- Thread 线程 A 运行,认为
player
不是null
,尝试访问其playerRect
成员(member),但既然现在是null
,它是NullPointerException
被抛出
关于java - 为什么我只是有时会收到此错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9692171/