0

非常に単純な OS シミュレーターを作成しようとしていますが、ラウンド ロビン アルゴリズムを機能させるのに苦労しています。基本的に私がやろうとしているのは、プロセスのバースト値を格納する循環リンク リストを作成することです。現在、ヌルポインタ例外が発生しています。リンクされたリストを使用してからしばらく経ちましたので、私のコードに耐えてください:

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 スレッド「メイン」での例外 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リストが空になるため、発生しているに違いありません。

最初の要素だけでなく、各反復中にリスト全体を出力するトレース コードを追加すると、何が起こっているのかが明らかになります。

デバッグとは、不透明なパズルを推測するのではなく、実際に何が起こっているのかを自分自身に理解させることです。実際に何が起こっているかを視覚化するために必要な主なツール (脳が失敗した場合) は、マシン自体です。トレース コードを追加するか、デバッガーのエキスパートになりましょう。規律とは、自分自身に真実を見させることです。

于 2012-11-20T23:33:26.550 に答える
0

現時点ではこれを確認するための Eclipse へのアクセス権がありませんがprocess.getFirst()、for ループ内のリストから最後の要素が削除された後に呼び出そうとしているのではないですか?

その行の前にブレークポイントを置き、デバッグ モードでコードを実行して確認することをお勧めします。

于 2012-11-20T23:34:19.650 に答える