2015-04-02 118 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