java - 为什么我只是有时会收到此错误?

标签 java nullpointerexception collision

基本上,我有一个基本的碰撞检测方法,有时当我运行小程序时,它会起作用,但大多数时候它不会起作用。这是错误和一些代码:

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.playerRectplatformnull .

您需要将它们分解为单独的检查,以准确找出哪一个为空(或在调试器中使用断点停止)。

要分离出检查,您的代码将如下所示:

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运行并替换playernull
  • Thread 线程 A 运行,认为 player不是null ,尝试访问其 playerRect成员(member),但既然现在是 null ,它是NullPointerException被抛出

关于java - 为什么我只是有时会收到此错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9692171/

相关文章:

java - 选择哪个 ChoiceBox-Event?

java - 在 Android 应用发送的 HTTP 请求之间维护 cookie

java - 在文档中显示方法体的一部分

android - Service.startForeground() 在使用 ServiceTestCase 运行时抛出 NullPointerException

java - 将 ResultSet 添加到 Jtable 中(两个类之间)

ios - 碰撞检测中断另一个碰撞检测 - Swift

python - pygame中的碰撞检测

java - 以生产就绪方式执行 bazel-buildfarm,无需 "bazel run"

java - 为什么我的 Spring @Autowired 字段为空?

python - Pygame 墙 Sprite 碰撞