Java线程和空指针错误

Java线程和空指针错误,java,multithreading,nullpointerexception,Java,Multithreading,Nullpointerexception,我正在为宇宙飞船上的一个假想的气闸系统写一段代码,我用这个方法随机生成两个随机门中的一个,然后打开: while (true){ int doorNum = (int)((Math.random() * 10) % doors.length); doors[doorNum].requestToOpen(); try{ Thread.sleep(800); } catch(Interru

我正在为宇宙飞船上的一个假想的气闸系统写一段代码,我用这个方法随机生成两个随机门中的一个,然后打开:

while (true){

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


        doors[doorNum].requestToOpen();

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


}
它从两个门阵列中选择一个可能的门,在runnable 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");
            }



        }
    }
}

在架构级别上,这里有相当多的缺陷可能是导致错误的原因,但是如果没有发布堆栈跟踪并显示堆栈跟踪所指的行,那么实际上是什么导致了错误并不明显

使用
ScheduledExecutorService
而不是带有睡眠的线程

使用枚举作为门状态,或调用打开或关闭状态,以明确其含义

门应该知道它是什么门,不需要对门的名称进行比较

门对象应包含其状态

i、 e


异常发生在哪一行?在run方法中,我已将其添加到main post中这意味着lockOperator或Door1Status和Door2Status之一尚未初始化。
 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");
         }
     }
 }