2014-03-28 32 views
0

我正在写一些代码在飞船假想气闸系统,我用这个方法来随机生成的两个随机一个门被打开:Java线程和空指针错误

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请求被打开。但是当我尝试记录请求时,它变得很奇怪。我试着将它存储为一个字符串,并将其作为一个布尔值,通过设置变量等于doorName。如果我调试它,它确实有效,并且新的值被设置。但是,只要我想要在runnable的run()方法中使用该值,那么该值就会变为空,并且程序会抛出一个空异常错误,并且我不知道发生了什么问题。所以,这里的任何想法将是非常赞赏

这是我的run方法,它完全忽略了,如果,如果其他人,去直取东西:

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



     } 
    } 
} 
+0

在哪一行不例外发生? –

+0

在运行方法中,我将它添加到主帖 –

+1

这意味着lockOperator或Door1Status和Door2Status之一尚未初始化。 –

回答

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