0

我在主类中有一个名为Prims的类和一个类类型的优先级队列。在我用它的构造创建了一个类的实例之后,我想将对象推入队列中。编译得很好,但它显示了运行时NullPointerException错误。这是代码:

package mst.prims;

import java.util.*;

    public class Main {

        /**
         * Minimum Spanning Tree - Prim's Algorithm
         * @author Kaidul
         */
        static final int MAX = 100; 

        static class Prims{
            int u, v, cost;
            Prims(int u, int v, int cost){
                this.u = u;
                this.v = v;
                this.cost = cost;
            }
        }

        static PriorityQueue<Prims> q, q1, q2 = new PriorityQueue<Prims>(MAX);

        public static void main(String[] args)  {


            Scanner input = new Scanner(System.in);

            for (int i = 0; i < 7; i++) {
                int u, v, cost;
                u = input.nextInt();
                v = input.nextInt();
                cost = input.nextInt();
                Prims temp = new Prims(u, v, cost);

                q.add(temp);
            }
        }

    }

错误 :

1 2
2 3
Exception in thread "main" java.lang.NullPointerException
    at mst.prims.Main.main(Main.java:36)

我是 Java 新手,无法修复它。

4

2 回答 2

4

它不应该给予NullPointerException,而应该给予ClassCastException。因为您的类Prims没有实现Comparable接口,因此无法推入Priority Queue.

您需要ComparablecompareTo您的nested Prims class

请为您的变量使用有意义的名称。u对我来说v似乎很模糊,对它们所代表的含义没有任何意义。

于 2012-10-25T05:49:29.610 回答
3

来自 Javadoc 的PriorityQueue

依赖于自然排序的优先级队列也不允许插入不可比较的对象(这样做可能会导致 ClassCastException)。

您必须ComparablePrims. 如果您打算Prims在集合中使用,您还应该覆盖equals()hashCode()使用适合您的对象的实现。

于 2012-10-25T05:50:25.140 回答