2017-01-17 59 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