【问题标题】:Java Threads and Null Pointer ErrorJava 线程和空指针错误
【发布时间】:2014-03-28 18:16:27
【问题描述】:

我正在为宇宙飞船中的一个虚构的 AirLock 系统编写一些代码,我使用这种方法随机生成要打开的两个随机门之一:

while (true){

        int doorNum = (int)((Math.random() * 10) % doors.length);


        doors[doorNum].requestToOpen();

        try{
            Thread.sleep(800);
        }
        catch(InterruptedException ex){
            ex.printStackTrace();
        }


}

它从两个数组中选出一个可能的门,在可运行的 AirLockDoor 类中,我尝试确认请求,然后将其记录下来:

public void  requestToOpen() {

    System.out.println(doorName +  " requests to be opened");

    if(doorName.equals("Door 1")){
        Door1Status = true;
    }
    else if (doorName.equals("Door 2")){
        Door2Status = true;
    }


}

在这里,doorName 变量工作正常,它会打印出 Door 1/Door 2 请求打开。但是当我尝试记录请求时,它变得很奇怪。通过将变量设置为等于 doorName,我尝试将其存储为字符串和布尔值。如果我调试它,它确实有效并且新值被设置。但是,一旦我想在 runnable 的 run() 方法中使用该值,该值就会变为 null,并且程序会抛出 null 异常错误,我不知道出了什么问题。所以这里的任何想法都会非常感激

这是我的 run 方法,它完全忽略了 if 和 if else,直接进入 else:

public  synchronized   void run() { 
    while (true){
        if(lockOperator.isLockState()){
            System.out.println("Request denied, the lock is engaged");
        }
        else{
            if(Door1Status){
                System.out.println("Door 1 will open");
            }
            else if(Door2Status){
                System.out.println("Door 2 will open");
            }
            else{
                System.out.println("Else");
            }



        }
    }
}

【问题讨论】:

  • 异常发生在哪一行?
  • 在run方法中,我已经添加到主帖中了
  • 这意味着 lockOperator 或 Door1Status 和 Door2Status 之一尚未初始化。

标签: java multithreading nullpointerexception


【解决方案1】:

在架构级别上存在很多可能导致错误的缺陷,但如果不发布堆栈跟踪并显示堆栈跟踪所指的行,则不清楚实际导致它的原因。

使用ScheduledExecutorService 而不是休眠的线程。

对门的状态使用枚举或将状态称为打开或关闭,这意味着什么。

门应该知道是什么门,不用比门名。

门对象应该包含它的状态。

 public class Door {
     boolean open;
     String name;

     void setOpen(boolean open) {
         if (this.open == open) {
            return;
         }
         this.open=open;
         if (open) {
             System.out.println(doorName + " opens");
         } else {
             System.out.println(name + " closes");
         }
     }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 1970-01-01
    相关资源
    最近更新 更多