Java 为什么我只是偶尔会犯这样的错误?
基本上,我有一个碰撞检测的基本方法,有时当我运行applet时,它可以工作,但大多数时候它不能工作。以下是错误和一些代码:Java 为什么我只是偶尔会犯这样的错误?,java,nullpointerexception,collision,Java,Nullpointerexception,Collision,基本上,我有一个碰撞检测的基本方法,有时当我运行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)
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
您需要将它们分成单独的检查,以准确地确定哪一个为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
- 线程线程A运行时,认为
不是player
,尝试访问其null
成员,但由于它现在是playerRect
,因此抛出null
NullPointerException
player
、player.playerRect
还是playerRect
平台,即null
。。。我们没有足够的信息要知道。请将synchronized关键字添加到checkCollision。你确定Adam Batkin的所有变量首先都是非空的吗?请使用调试器逐步执行以确保。