2014-03-28 48 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"); 
     } 
    } 
}