Java - StackOverflowError - 访问HashMaps

时间:2017-01-17 14:15:13

标签: java stack-overflow

尝试在另一个类中调用方法时,我得到java.lang.StackOverflowError

我认为问题是由于每个类在彼此之间实例化,但我不确定它为什么会导致此错误或如何修复它。

来自Main()的方法调用:

    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)

1 个答案:

答案 0 :(得分:5)

您的Logic类会在实例化时创建SensorMaps的实例。

private SensorMaps mapAccess = new SensorMaps();

您的SensorMaps类会在实例化时创建Logic的实例。

private Logic sensorConnect = new Logic();

因此,无论何时创建这两个类之一的实例,都会进入以StackOverflowError结尾的无限循环。

你应该重新考虑你的逻辑,并消除这些实例变量中的至少一个(或者如果它有意义的话,将它们改为静态变量)。

我不知道你在哪里使用sensorConnect,所以我不知道是否有必要。