значения объекта, хранящиеся в связанном списке, печатаются, но не используются - PullRequest
0 голосов
/ 11 сентября 2018

Я довольно новичок в Java и работаю над проектом по моделированию CPU scheduler в Java, и я использую 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: %s\n",Ttotal,Que.getFirst().getID());
            Que.getFirst().setTstart(Ttotal);
            Ttotal = Ttotal+Exec;
            Que.getFirst().setTend(Ttotal);
            Quecleared.add(Que.poll());
    }   
}

Поэтому, когда я использую System.out.println, я получаю ожидаемый результат, который я прочитал в список.Но все остальное, что я пытаюсь сделать со ссылкой на элементы объекта процесса, не будет работать.Любая помощь будет принята с благодарностью

1 Ответ

0 голосов
/ 11 сентября 2018
while (!Que.isEmpty()) 
{
        Ttotal = Ttotal + disp;
        System.out.println(Que.peekFirst().getExecSize());
        Exec=Que.peekFirst().getExecSize();
        output += String.format("T%d: %s\n",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, как только объект был создан, он больше не считается null, даже если это empty.Скорее всего, здесь происходило то, что вы продолжали повторять цикл while(Que != null) до тех пор, пока не вызвали Que.poll() для всех элементов списка.

После очистки списка вы не вышли из цикла, поскольку Queвсе еще не было null.Затем вызов getFirst() для пустого экземпляра LinkedList вызвал исключение.

Подобную ситуацию можно увидеть здесь с пустыми и пустыми строками: Разница между нулевым и пустым ("") 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?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...