存储在打印但不可用的链表中的对象的值



我对Java相当陌生,正在做一个在Java中模拟CPU scheduler的项目,我正在使用linked list来存储从外部主列表中读入的每个进程对象。当我测试打印过程及其包含的变量时,一切都按预期出现,但每当我尝试对它们做某事时,它就会停止工作。

public class process
String ID;
int Arrive;
int ExecSize;
int Execstore;
int Tstart;
int Tend;
int quant;
public process(String ID,int Arrive,int ExecSize) {
this.ID = ID;
this.Arrive = Arrive;
this.ExecSize = ExecSize;
this.Execstore=ExecSize;
this.Tend = 0;
this.Tstart = 0;
this.quant = 4;
}
public void setquant(int update) {
this.quant = update;
}
public int getquant() {
return quant;
}
public void setExecSize(int update) {
this.ExecSize = update;
}
public void setTend(int update) {
this.Tend = update;
}
public void setTstart(int update) {
this.Tstart = update;
}

String getID() {
return ID;
}
int getArrive() {
return Arrive;
}
int getExecSize() {
return ExecSize;
}
int getTstart() {
return Tstart;
}
int getTend() {
return Tend;
}
int getExecstore() {
return Execstore;
}

这是用于模拟的类

public class fcfs {
int disp;
int Ttotal = 0;
int Exec;
int Turn;
int Wait;
String output;
LinkedList<process> Que = new LinkedList<process>();
LinkedList<process> Quecleared = new LinkedList<process>();
public fcfs(LinkedList<process> B,int D) {
Que.addAll(B);
disp=D;
}
public void run() 
{
while (Que != null) 
{
Ttotal = Ttotal + disp;
System.out.println(Que.getFirst().getExecSize());
Exec=Que.getFirst().getExecSize();
output += String.format("T%d: %sn",Ttotal,Que.getFirst().getID());
Que.getFirst().setTstart(Ttotal);
Ttotal = Ttotal+Exec;
Que.getFirst().setTend(Ttotal);
Quecleared.add(Que.poll());
}   
}

因此,每当我使用System.out.println时,我都会得到我读入列表的预期结果。但是我尝试引用进程对象的元素的任何其他操作都不起作用。任何帮助将不胜感激

while (!Que.isEmpty()) 
{
Ttotal = Ttotal + disp;
System.out.println(Que.peekFirst().getExecSize());
Exec=Que.peekFirst().getExecSize();
output += String.format("T%d: %sn",Ttotal,Que.peekFirst().getID());
Que.peekFirst().setTstart(Ttotal);
Ttotal = Ttotal+Exec;
Que.peekFirst().setTend(Ttotal);
Quecleared.add(Que.pollFirst());
}

这不应该在Exec = Que.peekFirst().getExecSize();上引发错误

当容器为空时,将引发该错误。

编辑

在代码中,您指定了条件Que != null。 在java中,一旦一个对象被实例化,即使它是empty的,它也不再被认为是null的。 这里发生的很可能是你继续遍历while(Que != null)循环,直到你调用了列表的所有元素Que.poll()

清除列表后,您没有退出循环Que因为仍然没有null。 然后,在LinkedList的空实例上调用getFirst()会引发异常。

在这里可以看到类似的情况,空字符串与空字符串: 空和空 ("( Java 字符串之间的区别

编辑 2

看起来getID()getExecSize()等的类方法是通过引用传递值,而不是复制它们的值。 因此,从队列传递引用后所做的任何更改都将更改您尝试对其进行的任何副本。

最好通过创建对象的新实例并从函数返回该实例来避免这种情况。显示在下面链接的问题的答案中:

class Foo {
private Bar myBar;
public Foo deepCopy() {
Foo newFoo = new Foo();
newFoo.myBar = myBar.clone(); //or new Bar(myBar) or myBar.deepCopy or ...
return newFoo;
}
}

有关传递values而不是reference values预先存在的实例的方法以及实际上什么是浅拷贝的更多信息,请查看此链接: 在 Java 中,什么是浅拷贝?

相关内容

  • 没有找到相关文章

最新更新