0

我正在尝试编写一个非常简单的操作系统模拟器,但我无法让我的循环算法工作。基本上我要做的是创建一个循环链表来存储进程的突发值。现在我得到一个空指针异常。自从我使用链表以来已经有一段时间了,所以请耐心等待我的代码:

public static void RR3(int numProcess, int[] cpuBurst, int[] arrivalTime){
    int quantum = 3,time = 0, temp;
    int completionTime = 0;
    LinkedList <Integer>process = new LinkedList();
    for (int i = 0; i < numProcess; i++) {
        process.add(i, cpuBurst[i]);
    }

    while (process.isEmpty() != true){

        for (int j  = 0; j < quantum; j++) {
            System.out.println(process.getFirst());
            if(process.peek() == 0 ){
                completionTime = completionTime + time;
                process.remove();
            }
            else{
                temp = process.pop();
                process.push(temp - 1);                   
                time++;                  
            }
        }
        process.addLast(process.getFirst()); 
        process.removeFirst();
    }

    double act = (double) completionTime/numProcess;
    System.out.println("-----------------RR3-----------------");
    System.out.println("             Act = " + act + "ms");  
}

我使用链表对吗?任何帮助表示赞赏。编辑:我输入 System.out.println(process.getFirst()); 在第一个 for 循环之后获得某种堆栈跟踪,这是我的输出:

6 5 4 4 3 2 10 9 8 7 6 5 3 2 1 7 6 5 线程“main”中的异常 java.util.NoSuchElementException 4 3 2 1 4 3 1 在 java.util.LinkedList.getFirst(LinkedList.java:242 ) 2 1 在 OsSimulator.RR3(OsSimulator.java:61) 在 OsSimulator.main(OsSimulator.java:79) Java 结果:1

我输入的爆发时间是 6、4、10、7,所以看起来它在正确的轨道上,但我收到这条线的错误

process.addLast(process.getFirst());

现在它没有这样的元素例外。

4

3 回答 3

0

这意味着它所说的。没有第一个元素,因此process列表为空。

这一定会发生,因为在j循环中处理 quanta 使列表为空。

如果您添加跟踪代码以在每次迭代期间打印出整个列表,而不仅仅是第一个元素,那么发生的事情将变得非常明显。

调试总是让自己看到真正发生的事情,而不是猜测一个不透明的谜题。您必须可视化真正发生的事情(当您的大脑让您失望时)的主要工具是机器本身。添加跟踪代码或成为调试器专家。纪律是强迫自己看到真相。

于 2012-11-20T23:33:26.550 回答
0

process.getFirst()我目前无法访问 eclipse 来检查这个,但是你确定你没有在从 for 循环内的列表中删除最后一个元素后尝试调用吗?

我建议在该行之前放置一个断点,然后在调试模式下运行代码进行验证。

于 2012-11-20T23:34:19.650 回答
0

在调用之前process.getFirst()确保List不为空

public static void RR3(int numProcess, int[] cpuBurst, int[] arrivalTime) {
    int quantum = 3, time = 0, temp;
    int completionTime = 0;
    LinkedList<Integer> process = new LinkedList<Integer>();
    for (int i = 0; i < numProcess; i++) {
        process.add(i, cpuBurst[i]);
    }

    while (process.isEmpty() != true) {
        for (int j = 0; j < quantum; j++) {
            if (process.size() == 0)
                break;

            System.out.println("Process: " + process.getFirst());
            if (process.peek() == 0) {
                completionTime = completionTime + time;
                process.remove();
            } else {
                temp = process.pop();
                process.push(temp - 1);
                time++;
            }
        }
        if (process.size() == 0)
            break;
        process.addLast(process.getFirst());
        process.removeFirst();
    }

    double act = (double) completionTime / numProcess;
    System.out.println("-----------------RR3-----------------");
    System.out.println("             Act = " + act + "ms");
}
于 2016-01-14T10:05:58.230 回答