【问题标题】:Exception in thread "main" java.lang.NullPointerException in DVD sorting programDVD 排序程序中线程“main”java.lang.NullPointerException 中的异常
【发布时间】:2013-04-05 02:45:10
【问题描述】:

我正在尝试创建一个程序,将 DVD 信息放入一个数组中,并使用 Comparable 中的 compareTo 方法根据标题按字母顺序对它们进行排序。

我有一个布尔方法可以判断两个标题是否相同:

public boolean equals (Object other)
{
    return (title.equals(((DVD)other).getTitle()));
}

我的 compareTo 方法如下所示:

public int compareTo (Object other)
{
    int result;

    String otherTitle = ((DVD)other).getTitle();

    result = title.compareTo(otherTitle);

    return result;
}

这两个方法在我实现 Comparable 的 DVD 类中。

我直接从一个按字母顺序对名称进行排序的示例中使用了排序算法本身,但这里也是如此:

public class DVDSorting 
{
    public static void selectionSort (Comparable[] list)
    {
        int min;
        Comparable temp;

        for (int index = 0; index < list.length-1; index++)
        {
            min = index;
            for (int scan = index+1; scan < list.length; scan++)
                if (list[scan].compareTo(list[min]) < 0)
                    min = scan;

            temp = list[min];
            list[min] = list[index];
            list[index] = temp;
        }
    }

    public static void insertionSort(Comparable[] list)
    {
        for (int index = 1; index < list.length; index++)
        {
            Comparable key = list[index];
            int position = index;
            while (position > 0 && key.compareTo(list[position-1]) < 0)
            {
                list[position] = list[position-1];
                position--;
            }

            list[position] = key;
        }
    }
}

然后我创建了一个 DVDCollection 类来初始化数组并包含一个添加 DVD 的方法。

在我要测试的驱动程序类中,我能够插入 DVD 并打印出插入的内容,但是当我尝试对它们进行排序时,我得到一个空指针异常,即使我没有看到任何初始化为 null 的东西。这是我的司机:

public class Movies
{
    public static void main (String[] args)
    {
        DVDCollection movies = new DVDCollection();

        movies.addDVD("The Godfather", "Francis Ford Coppola", 1972, 24.95, true);
        movies.addDVD("District 9", "Neill Blomkamp", 2009, 19.95, false);
        movies.addDVD("Iron Man", "Jon Favreau", 2008, 15.95, false);
        movies.addDVD("All About Eve", "Joseph Mankiewicz", 1950, 17.50, false);
        movies.addDVD("The Matrix", "Andy & Lana Wachowski", 1999, 19.95, true);
        movies.addDVD("Clash of the Titans", "Louis Leterrier", 2010, 19.95, true);

        DVDSorting.selectionSort(movies.collection);
        System.out.println (movies);

        movies.addDVD("Iron Man 2", "Jon Favreau", 2010, 22.99, false);
        movies.addDVD("Casablanca", "Michael Curtiz", 1942, 19.95, false);
        movies.addDVD("Clash of the Titans", "Desmond Davis", 1981, 5.00, false);


        DVDSorting.selectionSort(movies.collection);
        System.out.println (movies);
    }
}

我在排序调用中使用了 movies.collection,因为当我尝试只使用我看过的示例之类的电影时,它说 selectionSort 不适用于电影所以我将 collection 设为公共变量并使用它。

这是错误。

Exception in thread "main" java.lang.NullPointerException
    at DVDSorting.selectionSort(DVDSorting.java:13)
    at Movies.main(Movies.java:15)

它告诉我错误在 DVDSorting 类中,但由于它是从另一个来源复制的,我感觉实际错误在我的 DVD 类中的 compareTo 方法中。

如果我的问题不符合网站的适当礼仪,我很抱歉,这是我第一次发帖。任何帮助将不胜感激。

【问题讨论】:

    标签: java eclipse comparable


    【解决方案1】:

    我的猜测是listlist[scan]selectionSort() 方法中的某个时刻为空。也许尝试验证 movies.collection(来自您的 main 方法)实际上存储了您认为的值。

    这对于 Eclipse 调试器来说是一项很好的任务。

    【讨论】:

    • selectionSort() 方法中的异常在我调用 compareTo() 方法的那一行。我只是对它的工作原理有点困惑。我正确实施了吗?
    • 如果异常发生在compareTo() 中,那么该方法将列在异常堆栈跟踪的顶部,在selectionSort() 上方。但既然您知道该行发生异常,NullPointerException 的唯一真正可能性是 list[scan] 对于 scan 的某些值是空的。
    猜你喜欢
    • 2013-11-21
    • 1970-01-01
    • 1970-01-01
    • 2012-12-09
    • 2023-03-10
    • 2013-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多