我正在为宇宙飞船上的假想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");
}
}
}
}
答案 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");
}
}
}