Java线程和空指针错误
我正在为宇宙飞船上的一个假想的气闸系统写一段代码,我用这个方法随机生成两个随机门中的一个,然后打开:Java线程和空指针错误,java,multithreading,nullpointerexception,Java,Multithreading,Nullpointerexception,我正在为宇宙飞船上的一个假想的气闸系统写一段代码,我用这个方法随机生成两个随机门中的一个,然后打开: while (true){ int doorNum = (int)((Math.random() * 10) % doors.length); doors[doorNum].requestToOpen(); try{ Thread.sleep(800); } catch(Interru
while (true){
int doorNum = (int)((Math.random() * 10) % doors.length);
doors[doorNum].requestToOpen();
try{
Thread.sleep(800);
}
catch(InterruptedException ex){
ex.printStackTrace();
}
}
它从两个门阵列中选择一个可能的门,在runnable 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");
}
}
}
}
在架构级别上,这里有相当多的缺陷可能是导致错误的原因,但是如果没有发布堆栈跟踪并显示堆栈跟踪所指的行,那么实际上是什么导致了错误并不明显 使用
ScheduledExecutorService
而不是带有睡眠的线程
使用枚举作为门状态,或调用打开或关闭状态,以明确其含义
门应该知道它是什么门,不需要对门的名称进行比较
门对象应包含其状态
i、 e
异常发生在哪一行?在run方法中,我已将其添加到main post中这意味着lockOperator或Door1Status和Door2Status之一尚未初始化。
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");
}
}
}