2015-04-02 123 views
0
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();   
    } 
} 

我有一个生成数组,并调用另一个文件:为什么我得到stackoverflow?

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

为什么我在这条线让计算器:返回getAnimalTagComparator();

+0

你为什么不?这条线是做什么的? – 2015-04-02 04:09:08

回答

3

getAnimalTagComparator()调用自己递归无限次(或至少直到堆栈溢出)。这导致堆栈溢出。

你应该为你的类和方法使用不同的名称,并更改方法是这样的:

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

和类更改为static class AnimalTagComparator。 (因为AnimalTagComparator类嵌套在您的SortAnimal类中,并且没有将其设置为静态,所以需要使用静态修饰符,因此您需要一个包含SortAnimal的实例才能创建AnimalTagComparator的实例)。

+0

我只是尝试添加新的名称并更改其他名称,但现在我收到此错误:当我尝试添加新的时候,我收到另一个错误:没有可以访问SortAnimal类型的封闭实例。必须使用SortAnimal类型的封闭实例来限定分配(例如,x.new A(),其中x是SortAnimal的一个实例)。 – AlldaRage 2015-04-02 04:14:46

+0

@AlldaRage查看我的编辑 - 使您的AnimalTagComparator类变为静态,您不需要封闭的实例。 – Eran 2015-04-02 04:16:52

+0

谢谢!!!!!! – AlldaRage 2015-04-02 04:47:43

1

因为你的代码只是调用自己(你正在调用递归方法)。 由于没有这个呼叫终止,那么你最终会得到一个错误的StackOverflow

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

如果你想调用其他类中,你可以做

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

建议将课程名称更改为更有用的内容会很好。 – 2015-04-02 04:11:47

+0

当我尝试添加新的时候,我收到另一个错误:没有可以访问类型SortAnimal的封闭实例。必须使用SortAnimal类型的封闭实例来限定分配(例如,x.new A(),其中x是SortAnimal的一个实例)。 – AlldaRage 2015-04-02 04:11:47

+0

为什么你有这个嵌入式类?尝试重新比较比较器示例。 – 2015-04-02 04:15:58