Java线程和空指针错误

时间:2014-03-28 10:06:50

标签: java multithreading nullpointerexception

我正在为宇宙飞船上的假想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变量工作正常,它将打印出要打开的1门/ 2门请求。但是当我尝试记录请求时,它会变得奇怪。我已经尝试将它存储为String和作为布尔值,通过将变量设置为等于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");
            }



        }
    }
}

1 个答案:

答案 0 :(得分:0)

在架构层面上存在很多可能导致错误的缺陷,如果没有发布堆栈跟踪并显示堆栈跟踪引用的行,那么实际上导致错误并不明显。

使用ScheduledExecutorService而非睡眠线程。

使用enum作为门状态或打开或关闭状态,这很清楚它是什么意思。

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

门对象应包含其状态。

 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");
         }
     }
 }