2012-10-15 44 views
2

我正在做一个模拟正在处理的CPU作业的项目。基本上,用户将输入一个长度将被处理的作业和一个优先级键(从-20到19,从-20开始获得更高优先级)。到目前为止,我已经完成了所有这些工作,除了程序正常终止外。基本上我需要程序在我的优先级队列中的所有作业都被处理完后终止。当每个作业得到处理时,它将从长度减去,直到它为0.当它为0时,它将从优先级队列中移除。当没有作业剩余时,(优先队列为空),程序应该在输入n后不终止任务。然而,由于某种原因,我完成了我的代码的方式,它不是终止。相反,当我输入n时,当没有作业需要输入时,它会给我一个空指针错误。任何人都可以指出我可能犯了什么错误吗?谢谢。如何让我的Java程序终止?

样品输入输出程序将具有以下格式(作业名称,长度,优先权)执行以下操作:

输入要处理的作业:
I:JOB1 3 0
ö :JOB1

输入新的要处理的作业:
我:N
○:JOB1

输入新待处理的作业:
我:作业2 1-3
○:作业2

输入新的要处理的作业:
我:N
○:JOB1

输入要处理的新的工作:
我:N

这是我的代码:

import java.util.Scanner; 
import java.lang.Integer; 

public class PQScheduler { 
String command = ""; 
String process = ""; 
String[] inputParts = null; 
SLPQueue Q; 
boolean empty = false; 

PQScheduler(String inputCommand) { 
    Q = new SLPQueue(); 
    Scanner comReader = new Scanner(System.in); 
    this.command = inputCommand; 
    this.inputParts = command.split("\\s");  // will split input at whitespace and store parts into array 

    while (empty == false) {  // will loop until priority queue becomes empty 
     if (this.inputParts[0].equals("n")) {  // input of no new jobs, will continue processing previous jobs however 
      if (Q.isEmpty()) { 
       System.exit(0); 
      } 
      else { 
       this.process(Q.entries.getHead(), Q.entries.getHead().getValue()); 
      } 
     } 
     else { 
      int value = Integer.parseInt(inputParts[1]); // parses value of length into an integer 
      int key = Integer.parseInt(inputParts[2]);  // parse value of key into an integer 

      try { 
       Q.insert(inputParts[0], key, value);  // inserts job, length, and key into priority queue 
      } catch (InvalidKeyException e) { 
       e.printStackTrace(); 
      } 
      this.process(Q.entries.getHead(), Q.entries.getHead().getValue());  // processes the highest priority job 
     } 
     System.out.println("Enter new job to be processed: "); 
     command = comReader.nextLine(); 
     inputParts = command.split("\\s"); 
    } 
} 

public void process(Node n, int value) { 
    if (value == 0) { 
     try { 
      Q.removeMin();  // removes the finished job 
      if (Q.isEmpty()) { 
       empty = true; 
      } 
      else { 
       process(Q.entries.getHead(), Q.entries.getHead().getValue()); // processes next highest priority job 
      } 

     } catch (EmptyPriorityQueueException e) { 
      e.printStackTrace(); 
     } 
    } 
    else { 
     n.setValue(value - 1);  // decrements job length by 1 when processed 
     process = n.getElement(); 
     System.out.println(process); 
    } 
} 

public static void main(String[] args) { 
    String inputCommand = ""; 
    Scanner mainReader = new Scanner(System.in); 

    System.out.println("Enter the job to be processed: ");  // takes in user input of job, length, and priority 
    inputCommand = mainReader.nextLine(); 

    PQScheduler scheduler = new PQScheduler(inputCommand); 
} 

}

public class SLPQueue implements PQueue { 
protected SLList entries; 
protected int size; 

public SLPQueue() { 
    entries = new SLList();  // creates a new linked list to store elements 
    size = 0; 
} 

public String min() throws EmptyPriorityQueueException { 
    if(entries.isEmpty()) throw new EmptyPriorityQueueException("Priority Queue is empty."); 
    else 
     return entries.getHead().getElement();  // gets the first node in priority queue 
} 

public Node insert(String e, int k, int v) throws InvalidKeyException { 
    Node tempNode = new Node(e, k, v, null); 
    insertEntry(tempNode); 
    return tempNode;  // insertion method to add values to node and then insert into priority queue 
} 

protected void insertEntry(Node n) {  // insertion method to add into priority queue 
    if (entries.isEmpty()) {  // checks if it is empty, if so, it will make it head of list 
     entries.addFirst(n); 
     size++; 
    } 
    else if (compare(n.getKey(), entries.getTail().getKey()) > 0) {  // checks to see if lower priority key inserted 
     entries.addLast(n);  // adds last if key inserted is lower priority than the current tail of list 
     size++; 
    } 
    else if (compare(n.getKey(), entries.getHead().getKey()) < 0) { 
     entries.addFirst(n);  // adds first if key inserted is higher priority than the current head of list 
     size++; 
    } 
    else { 
     Node temp1 = entries.getHead();  // starts traversal from beginning of list 
     Node temp2 = temp1;  // creates a second temporary node to "capture" node for node n to be inserted after 
     while (compare(n.getKey(), temp1.getKey()) > 0) {  // loop to see if keys are of lower priority 
      if (temp1.equals(entries.getHead())) {  // if statement created to set back temp2 by one node 
       temp1 = temp1.getNext(); 
      } 
      else { 
       temp2 = temp2.getNext();  // gets the node value before temp1 
       temp1 = temp1.getNext();  // gets the next temp1 value 
      } 
     } 
     temp2.setNext(n);  // loop will break when key has higher priority than temp1 key found 
     n.setNext(temp1); 
     size++; 
    } 
} 

public int compare(int k1, int k2) {  // comparator method to check for key priorities 
    int compare = 0; 
    if (k1 >= k2) { 
     compare = 1;  // returns 1 if first key is of lower priority than second key 
    } 
    else if (k1 < k2) {  // returns -1 if first key is of higher priority than second key 
     compare = -1; 
    } 
    return compare; 
} 

public Node removeMin() throws EmptyPriorityQueueException {  // removal method to remove from head of list 
    if (entries.isEmpty()) throw new EmptyPriorityQueueException("Priority Queue is empty."); 
    else { 
     return entries.removeFirst(); 
    } 
} 

public int size() {  // returns size of priority queue list 
    return size; 
} 

public boolean isEmpty() {  // checks to see if priority queue list is empty 
    return size == 0; 
} 

}

+1

什么线产生的NPE? –

+0

线程“main”中的异常java.lang.NullPointerException \t at PQScheduler.process(PQScheduler.java:57) \t at PQScheduler。(PQScheduler.java:29) \t at PQScheduler.main(PQScheduler.java:78) – Asdeev

+0

这是它给我的例外。 – Asdeev

回答

1

我敢打赌,Q.isEmpty()没有表现得像你想让它。它看起来像在队列的size上运行,但您的removeMin方法不会减少此值。

尝试SLPQueue.removeMin

+0

噢好吧,我通过创建要处理的作业的跟踪器来修复它,但是此修复似乎更好。谢谢! – Asdeev

1

SLPQueue()加入size--;else块就永远不会减少它的size值。它只是在这里和那里增加。因此,isEmpty()永远不会返回true,主循环中的empty永远不会得到true,因此您的程序永远不会结束。

因此改变removeMin()

public Node removeMin() throws EmptyPriorityQueueException {  // removal method to remove from head of list 
    if (entries.isEmpty()) throw new EmptyPriorityQueueException("Priority Queue is empty."); 
    else { 
     size--; 
     return entries.removeFirst(); 
    } 
}