【发布时间】: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