无法理解Arrays.sort()功能

时间:2013-11-06 05:16:40

标签: java nullpointerexception

我是Java新手,我正在尝试了解比较器接口。 我尝试了以下代码:

package comparator;

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

public class comparator {
    public static void main(String args[]){
        bankAccount[] ba=new bankAccount[500];
        ba[0]=new bankAccount(50);
        ba[1]=new bankAccount(90);
        ba[2]=new bankAccount(20);
        Comparator c=new comparing();
        System.out.println(c.compare(ba[0], ba[1]));
        Arrays.sort(ba, c);
    }
}

class bankAccount{
    public bankAccount(double bal){
        balance=bal;
    }
    public double balance;
}

class comparing implements Comparator{
    public int compare(Object first, Object second){
        bankAccount ba1=(bankAccount)first;
        bankAccount ba2=(bankAccount)second;
        int retval;
        if(ba1.balance<ba2.balance){
            retval=-1;
        }
        else if(ba1.balance>ba2.balance){
                retval=1;
            }
        else{
            retval=0;
        }
        return retval;
    }
}

我收到以下错误消息:

Exception in thread "main" java.lang.NullPointerException
    at comparator.comparing.compare(comparator.java:29)
    at java.util.TimSort.binarySort(TimSort.java:265)
    at java.util.TimSort.sort(TimSort.java:208)
    at java.util.TimSort.sort(TimSort.java:173)
    at java.util.Arrays.sort(Arrays.java:659)
    at comparator.comparator.main(comparator.java:13)

我能知道错误是什么吗?我应该如何使用Arrays.sort()方法。任何帮助将是真诚的感谢。

5 个答案:

答案 0 :(得分:8)

main方法中,您已经声明了一个500长度的数组,但只初始化了3个元素,因此其中497个是null。这会导致比较器出现问题,因为比较器会被调用多对元素,包括一些null元素。

尝试修改main方法,仅声明并初始化3长度数组,然后再次编译并运行它。也许你的比较器确实存在问题,但至少让我们删除明显的问题并尝试对所有元素进行排序 - null

答案 1 :(得分:1)

除了Platnium Azure之前的回答之外,您还应该在Comparator子类中使用泛型,如下所示:

class comparing implements Comparator<bankAccount>
{
...
    @Override
    public int compare(bankAccount first, backAccount second)
    {
    ...
    }

    @Override
    public boolean equals(Object obj)
    {
    ...
    }
...
}

这将强制使用您的comparing类来仅对bankAccount个实例进行排序。

答案 2 :(得分:0)

问题在于你只填充了500条目数组的前3个条目,sort方法贯穿其中并进行比较,直到它满足条目4,这是null,在尝试时抛出NPE调用其compareTo(..)方法。

你可以通过填充数组或只给它3的长度来修复它。

答案 3 :(得分:0)

将bankAccount数组的大小更改为3。

如果任何数组元素为null,如果比较器不支持null,它将抛出空指针异常;

以下代码适用于数组大小500,因为比较器处理null case。

    if (first == null || second == null)
    {
        return 0;
    }

修改后的原始类代码从修复开始(查找比较类中的更改):

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

public class comparator {
    public static void main(String args[]){
        bankAccount[] ba=new bankAccount[500];
        ba[0]=new bankAccount(50);
        ba[1]=new bankAccount(90);
        ba[2]=new bankAccount(20);
        Comparator c=new comparing();
        System.out.println(c.compare(ba[0], ba[1]));
        Arrays.sort(ba, c);
    }
}

class bankAccount{
    public bankAccount(double bal){
        balance=bal;
    }
    public double balance;
}

class comparing implements Comparator{
    public int compare(Object first, Object second){
        bankAccount ba1=(bankAccount)first;
        bankAccount ba2=(bankAccount)second;
        int retval;
        if (first == null || second == null)
        {
            return 0;
        }
        if(ba1.balance<ba2.balance){
            retval=-1;
        }
        else if(ba1.balance>ba2.balance){
                retval=1;
            }
        else{
            retval=0;
        }
        return retval;
    }
}

答案 4 :(得分:0)

您的数组未完全初始化,如果您不想初始化它,请更改comparing

class comparing implements Comparator{
public int compare(Object first, Object second){
    bankAccount ba1=(bankAccount)first;
    bankAccount ba2=(bankAccount)second;
    int retval;
    if (ba1==null || ba2 == null) {
        retval=0; // return what you want if bankAccount is null.
    }
    else if(ba1.balance<ba2.balance){
        retval=-1;
    }
    else if(ba1.balance>ba2.balance){
            retval=1;
        }
    else{
        retval=0;
    }
    return retval;
}
}