2017-01-17 3 views
1

別のクラス内のメソッドを呼び出すときにjava.lang.StackOverflowErrorを取得しようとしています。Java - StackOverflowError - アクセスHashMaps

私はこの問題が、各クラスがお互いにインスタンス化されているためだと思いますが、なぜこのエラーが発生するのか、どうやって解決するのかはわかりません。メインから

メソッドの呼び出し():

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

エラー出力における2つのキー行:

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

スタックトレースを読みます:Logicの19行目はSensorMapsの11行目を呼び出し、Logicの19行目を再度呼び出します。無限再帰、したがってStackOverflowError。 – toongeorges

答えて

5

をあなたのLogicクラスはインスタンス化されるたびにSensorMapsというインスタンスを作成します。

private SensorMaps mapAccess = new SensorMaps(); 

それがインスタンス化されるたびにあなたのSensorMapsクラスはLogicのインスタンスを作成します。したがって

private Logic sensorConnect = new Logic(); 

あなたはこの2つのクラスのいずれかのインスタンスを作成するたび、あなたはStackOverflowErrorで終わる無限ループに入ります。

ロジックを再検討し、これらのインスタンス変数の少なくとも1つを削除する(または、意味をなさない場合は静的変数に変更する)必要があります。

sensorConnectを使用している場所が表示されないため、必要かどうかわかりません。

+0

「Logic sensorConnect = new Logic();」が削除されているはずでしたが、Logicクラスを使用していた古いメソッドがまだ移行されていたはずです。 – Colin747