首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >我在java中使用线程时遇到了一些问题。

我在java中使用线程时遇到了一些问题。
EN

Stack Overflow用户
提问于 2018-06-07 07:54:20
回答 1查看 61关注 0票数 0

我刚开始使用线程,有人能解释一下为什么我有时会遇到这个异常吗:

代码语言:javascript
复制
Exception in thread "Thread-3" java.lang.NullPointerException
    at Game.tick(Game.java:96)
    at Game.run(Game.java:73)
    at java.lang.Thread.run(Unknown Source)

它发生在游戏开始或我玩到一半的时候。这个错误是如此不一致,以至于当它决定弹出时,我不知道是什么导致了它。

下面是run and tick方法:

代码语言:javascript
复制
public void run(){
    this.requestFocus();
    long lastTime = System.nanoTime();
    double amountOfTicks = 60.0;
    double ns = 100000000 / amountOfTicks;
    double delta = 0;
    long timer = System.currentTimeMillis();
    int frames = 0;
    while(isRunning) {
        long now = System.nanoTime();
        delta += (now - lastTime) / ns;
        lastTime = now;
            while(delta >= 1) {
                tick();
                //updates++;
                delta--;
            }
       render();
       frames++;

       if(System.currentTimeMillis() - timer > 1000) {
        timer += 1000;
        frames = 0;
        //updates = 0;
       }
    }
    stop();
}
public void tick(){

    for(int i = 0; i < handler.object.size(); i++){
        if(handler.object.get(i).getId() ==ID.Player){
            camera.tick(handler.object.get(0));
        }
    }
    handler.tick();
}

我很抱歉,如果这篇文章与其他帖子非常相似,我只需要一些快速修复(如果有)。我忘了提到,每次游戏启动时,错误都是不同的,例如:

代码语言:javascript
复制
Exception in thread "Thread-3" java.lang.NullPointerException
at Enemy.tick(Enemy.java:59)
at Handler.tick(Handler.java:13)
at Game.tick(Game.java:101)
at Game.run(Game.java:73)
at java.lang.Thread.run(Unknown Source)

Exception in thread "Thread-3" java.lang.NullPointerException
at Enemy.collision(Enemy.java:105)
at Enemy.tick(Enemy.java:31)
at Handler.tick(Handler.java:13)
at Game.tick(Game.java:101)
at Game.run(Game.java:73)
at java.lang.Thread.run(Unknown Source)

这也是处理程序类,如果它有帮助的话:

代码语言:javascript
复制
    import java.awt.Graphics;
import java.util.ArrayList;

public class Handler {

    ArrayList<GameObject> object = new ArrayList<GameObject>();


    public void tick(){
        for(int i = 0; i < object.size(); i++){
            GameObject tempObject = object.get(i);

            tempObject.tick();
        }
    }

    public void render(Graphics g){
        for(int i = 0; i < object.size(); i++){
            GameObject tempObject = object.get(i);

            tempObject.render(g);
        }
    }


    public void addObject(GameObject tempObject){
        object.add(tempObject);
    }

    public void removeObject(GameObject tempObject){
        object.remove(tempObject);
    }

    public void addObjectSpec(int i, GameObject tempObject){
        object.add(i, tempObject);
    }

}
EN

回答 1

Stack Overflow用户

发布于 2018-06-07 08:09:02

虽然没有足够的信息来写一个确凿的答案,但以下是你应该检查的一些事情:

  • 确保ID类具有名为Player
  • 的非空字段确保相机不为空
  • 确保处理程序不为空
  • 确保handler.object不为空
  • 检查所有线程安全对象
  • 确保handler.objects在执行循环时未被操作
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50731204

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档