虽然循环不起作用

时间:2010-01-30 08:20:39

标签: java nullpointerexception while-loop

我正在将此文本文件输入命令行:

800    5    10  
800    1    8  
800    7    7  
810    2    9  
845    2    10  
850    1    3  

第一列是时间,然后是优先级,然后是长度
输出按时间加上长度排序,如果项目的时间小于或等于当前时间,则输出下一个项目,优先级最高(是的,令人困惑,但是它是一个类项目)< / p>

将输出:

Job: [800,1,8] Start time: 800 End time:808  
Job: [800,5,10] Start time: 800 End time:818  
Job: [810,2,9] Start time: 810 End time: 819  
Job: [800,7,7] Start time: 800 End time: 807   
Job: [845,2,10] Start time: 845 End time 855   
Job: [850,1,3] Start time: 850 End time: 853     

使用带有名为event的队列方法的链表和一个名为queue的优先级队列 我的问题是while循环while (event.size() != 0 && queue.size() != 0)根本没有执行 如果我将其更改为do while循环,则在(event.peek().time <= currentTime)if (event.peek().time > currentTime)时会出现空指针异常错误 我已经尝试通过添加event.peek() != null修复空指针异常,但它仍然无法正常工作。事件(linkedlist)中有6个Job对象,所以我不知道为什么event.peek()返回null。

import java.util.*;
import java.io.*;

public class pj2
{   
    Queue<Job> event = new LinkedList<Job>();//interface queue
    PriorityQueue<Job> queue = new PriorityQueue<Job>();

    public static void main(String[] args) throws IOException
    {
        if (args.length != 1)
        {   
            System.out.println("Usage: java pj2 jobs.txt");
            System.exit(0);
        }
        else
            new pj2(args[0]);
    }

    public pj2 (String textFile) throws IOException
    {       
        File file = new File(textFile);
        if (!file.exists())
        {
            System.out.println(textFile + " does not exist.");
            System.exit(0);
        }

        //add time,priority,length to event queue
        Scanner data = new Scanner(file);
        while (data.hasNext())
        {
            int time = Integer.parseInt(data.next());
            int priority = Integer.parseInt(data.next());
            int length = Integer.parseInt(data.next());
            Job temp = new Job(time,priority,length);
            event.add(temp);
        }
        data.close();

        int currentTime = 0;
        //loop through priority queue, outputting results
        while (event.size() != 0 && queue.size() != 0)
        {
            if (queue.size() == 0)
                currentTime = event.peek().time;
            while (event.peek().time <= currentTime)
            {
                currentTime += event.peek().length;
                queue.offer(event.poll());
            }

            if (event.peek().time > currentTime)
            {
                currentTime = (event.peek().time + event.peek().length);
                queue.offer(event.poll());
            }

                System.out.println(queue.peek() + " Start time: " + queue.peek().time + " End time: " + (queue.peek().time + queue.peek().length));
                queue.poll();
        }

    }
}

public class Job implements Comparable<Job>
{
    int time, length, priority;

    public Job(int time, int priority, int length)
    {
        this.time = time;
        this.priority = priority;
        this.length = length;
    }
    public int compareTo(Job that)
    {
        if (this.priority == that.priority)
            return this.time - that.time;
        return this.priority - that.priority;
    }
    public String toString()
    {
        return "[" + time + "," + priority + "," + length + "]";
    }

}

2 个答案:

答案 0 :(得分:0)

+1以前海报指向调试器教程的指针。如果查看评估循环条件时找到的值,您将能够立即找到此问题。 (“哦,event.size()!= 0&amp;&amp; queue.size()!= 0是假的,因为queue.size()!= 0是假的。”)

通常,你解决这类问题的思维过程应该是,“如果while循环没有执行,它的条件是假的。我需要找出条件的哪一部分是错误的。从那里我可以弄清楚是否错误是'我的程序的前一部分是假的,它应该是真的',或者'这实际上不应该是循环条件的一部分'。“

在这种情况下,您需要event.size()!= 0 AND queue.size()!= 0,但是在循环之前不要向队列添加任何内容。我想你需要重新考虑你的循环条件。

答案 1 :(得分:0)

在阅读输入文件时,您填写了event列表,但填充queue留给了while循环,因此您的条件为:

    while (event.size() != 0 && queue.size() != 0)

永远不会是真的,因为队列仍然是空的。所以要么你需要改变你的 循环条件:

    while (event.size() != 0 || queue.size() != 0)

只要列表或队列仍然包含数据,就可以处理信息 您可能必须将循环拆分为2个循环,一个用于填充列表中的队列 然后使用队列来确定你的答案。