2017-01-17 58 views
1

當嘗試調用另一個類中的方法時,我得到一個java.lang.StackOverflowErrorJava - StackOverflowError - 訪問哈希映射

我認爲這個問題是由於每個類被相互實例化,但我不知道爲什麼它會導致這個錯誤或如何解決它。從主(

方法調用):

nexaConnect.returnAllChronologicalByRoom("bathroomSensorMappings"); 

邏輯():

public class Logic { 
    private SensorMaps mapAccess = new SensorMaps(); 

    void returnAllChronologicalByRoom(String room) { 
    System.out.print(mapAccess.returnMap(room).get(0)); 
    } 
} 

SensorMaps:

public class SensorMaps { 
    private Logic sensorConnect = new Logic(); 

    HashMap<Integer, String> returnMap(String mapChoice) { 
    return MapRegistry.find(mapChoice); 
    } 
} 

還有第三個MapRegistry類,但我不認爲這是造成問題,但我會包括它的完整性:

MapRegistry:

class MapRegistry { 
    static Map<String,HashMap<Integer,String>> allMaps = new HashMap<>(); 

    static void register(String name, HashMap<Integer,String> myMap) { 
    allMaps.put(name, myMap); 
    } 

    static HashMap<Integer,String> find(String name) { 
    return allMaps.get(name); 
    } 
} 

在誤差輸出的兩個關鍵行:

at com.company.SensorMaps.<init>(SensorMaps.java:11) 
at com.company.Logic.<init>(Logic.java:19) 

參考線:

private Logic sensorConnect = new Logic(); 
private SensorMaps mapAccess = new SensorMaps(); 

完整的錯誤輸出:

Exception in thread "main" java.lang.StackOverflowError 
    at com.company.SensorMaps.<init>(SensorMaps.java:11) 
    at com.company.Logic.<init>(Logic.java:19) 
    at com.company.SensorMaps.<init>(SensorMaps.java:11) 
    at com.company.Logic.<init>(Logic.java:19) 
    ... 
    at com.company.SensorMaps.<init>(SensorMaps.java:11) 
    at com.company.Logic.<init>(Logic.java:19) 
+0

讀取堆棧軌跡:邏輯的第19行調用SensorMaps的第11行,它再次調用邏輯的第19行。一個無限遞歸,因此是一個StackOverflowError。 – toongeorges

回答

5

您的Logic類在實例化時創建一個SensorMaps的實例。

private SensorMaps mapAccess = new SensorMaps(); 

時,它被實例化你的SensorMaps類創建的Logic一個實例。

private Logic sensorConnect = new Logic(); 

因此,只要您創建這兩個類的一個實例,你進入一個無限循環,在StackOverflowError結束。

您應該重新考慮您的邏輯並至少消除其中一個實例變量(或者如果有意義的話,將它們更改爲靜態變量)。

我沒有看到你在哪裏使用sensorConnect,所以我不知道是否有必要。

+0

謝謝,'private Logic sensorConnect = new Logic();'應該已經被刪除了,應該有一箇舊的方法應該被遷移出來,這個方法仍然在使用Logic類。 – Colin747