2017-01-17 6 views
1

Ich erhalte eine java.lang.StackOverflowError beim Versuch, eine Methode innerhalb einer anderen Klasse aufzurufen.Java - StackOverflowError - Zugriff auf HashMaps

Ich denke, das Problem liegt daran, dass jede Klasse in sich instanziiert wird, aber ich bin nicht sicher, warum es diesen Fehler verursacht oder wie es zu beheben.

Methodenaufruf von Main():

nexaConnect.returnAllChronologicalByRoom("bathroomSensorMappings"); 

Logic():

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); 
    } 
} 

Es gibt eine dritte MapRegistry Klasse, aber ich glaube nicht, Dies verursacht Probleme, aber ich werde es für die Vollständigkeit hinzufügen:

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); 
    } 
} 

Die beiden Hauptleitungen im Fehlerausgang:

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

zu Linien beziehen:

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

Der vollständige Fehlerausgang:

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

Lesen der Stack-Trace: Zeile 19 von Logic ruft Zeile 11 von SensorMaps auf, die wiederum die Zeile 19 von Logic aufruft. Eine unendliche Rekursion, also ein StackOverflowError. – toongeorges

Antwort

5

Deine Logic Klasse erstellt eine Instanz von SensorMaps, wenn es instanziiert wird.

private SensorMaps mapAccess = new SensorMaps(); 

Ihre SensorMaps Klasse erstellt eine Instanz Logic, wenn es instanziiert wird.

private Logic sensorConnect = new Logic(); 

also immer dann, wenn Sie eine Instanz von einem dieser beiden Klassen erstellen, erhalten Sie in eine Endlosschleife, die in StackOverflowError endet.

Sie sollten Ihre Logik erneut prüfen und mindestens eine dieser Instanzvariablen eliminieren (oder sie in eine statische Variable ändern, wenn es sinnvoll ist).

Ich sehe nicht, wo Sie sensorConnect verwenden, also weiß ich nicht, ob es notwendig ist.

+0

Danke, 'private Logic sensorConnect = new Logic();' hätte entfernt werden sollen, da war eine alte Methode, die hätte migriert werden sollen, die noch da war, die die Logic-Klasse benutzte. – Colin747