Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/353.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/vim/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我只是偶尔会犯这样的错误?_Java_Nullpointerexception_Collision - Fatal编程技术网

Java 为什么我只是偶尔会犯这样的错误?

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)

基本上,我有一个碰撞检测的基本方法,有时当我运行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);

非常感谢您的帮助!提前谢谢

答案是
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的所有变量首先都是非空的吗?请使用调试器逐步执行以确保。