为什么我得到stackoverflow?

时间:2015-04-02 04:08:15

标签: java

public class SortAnimal
{
    public static Comparator<Animal> getAnimalTagComparator()
    {
        return getAnimalTagComparator();
    }

class getAnimalTagComparator implements Comparator<Animal> {

    @Override 
    public int compare(Animal o1, Animal o2) {
        return o1.getTag()-o2.getTag();         
    }
}

我有另一个生成数组并调用的文件:

Comparator<Animal> getAnimalTagComparator = SortAnimal.getAnimalTagComparator();

为什么我在这一行上获得stackoverflow:return getAnimalTagComparator();

2 个答案:

答案 0 :(得分:3)

getAnimalTagComparator()递归地无限次地调用自身(或者至少在堆栈溢出之前)。这导致了堆栈溢出。

您应该为您的类和方法使用不同的名称,并将方法更改为:

public static Comparator<Animal> getAnimalTagComparator()
{
    return new AnimalTagComparator();
}

并将课程更改为static class AnimalTagComparator。 (static修饰符是必需的,因为AnimalTagComparator类嵌套在SortAnimal类中,并且不使其成为静态,您需要一个封闭的SortAnimal实例才能创建一个isntance AnimalTagComparator)。

答案 1 :(得分:1)

因为你的代码只是调用自己(你正在调用一个递归方法)。 由于没有终止此调用,因此您最终将获得StackOverflow错误

public static Comparator<Animal> getAnimalTagComparator()
{
    return getAnimalTagComparator();  // yes this is THIS method
}

如果你想打电话给你可以做的其他课

public static Comparator<Animal> getAnimalTagComparator()
{
    return new getAnimalTagComparator();
}