2014-07-04 135 views
0

編輯: commaString操作不是問題。是我的錯。見下文。在Arrays.asList(str.split(「,」)) - >由於錯誤遞歸的Stackoverflow

我寫了一個方法將逗號字符串轉換爲字符串列表。 但我在這種方法中得到了一個stackoverflow。

Exception in thread "main" java.lang.StackOverflowError 
at java.util.ArrayList.subList(Unknown Source) 
at java.lang.String.split(Unknown Source) 
at java.lang.String.split(Unknown Source) 
at de.dhbw.horb.routePlanner.SupportMethods.commaStrToStrList(SupportMethods.java:82) 

public static List<String> commaStrToStrList(String commaStr) { 
    if (commaStr == null) 
     return null; 
    return new ArrayList<String>(Arrays.asList(commaStr.split(","))); 
} 

那麼,爲什麼會出現這種情況?我的commaStr大嗎?如果是的話,還有什麼可以用於這個?

的方法doNextNode(ID)是一個遞歸: https://github.com/Spenhouet/RoutenplanerProjekt/blob/master/Routenplaner/main/de/dhbw/horb/routePlanner/parser/JDomGraphDataCreator.java

編輯:

的問題是由於我的遞歸方法缺失的條款。所以遞歸非常深入。起初,我將我的最大堆棧大小推到了3GB(-Xss3g),但它在內存不足的情況下異常結束。 :/

然後我想,如果有可能我的遞歸在某一點開始,並且一次又一次地做同樣的事情。因此,我添加了一張保存每個訪問節點(id)的地圖,並刪除失敗的重新定位節點(回溯)。

現在它就像一個魅力。 感謝Marco13指出我的遞歸最終變得越來越深。

+0

什麼是commaStr? –

+0

如果你的返回類型是List,你爲什麼把它放到一個新的ArrayList中?難道你不能只返回'Arrays.asList'? – MightyPork

+0

@Rod_Algonquin類似於以下內容:「第一,第二,第三,第四」 – Spen

回答

3

如果字符串是如此之大,它String.split()休息,你有以下幾種選擇:

  1. 嘗試StringTokenizer 這是不太可能好得多,但一去 它的價值。更新:我檢查了這個源代碼,它看起來非常簡單並且內存效率高,與選項3相當。
  2. 使用原始正則表達式Matcher並手動構建您的列表。
  3. 手動執行所有解析:遍歷字符,如果您點擊逗號,則使用最後一個逗號和當前逗號之間的字符創建一個字符串,並將其添加到列表中。

如果您仍然用完內存,則需要更復雜的方法,可能涉及將字符串寫入文件並以較小的塊讀回。

+0

StringTokenizer似乎正常工作。謝謝:) – Spen

+0

看起來好像我將不得不考慮其他解決方案。 異常在線程 「主」 java.lang.StackOverflowError的 \t在java.lang.String.indexOf(未知來源) \t在java.util.StringTokenizer.scanToken(未知來源) \t在java.util.StringTokenizer.nextToken (Unknown Source) \t ... – Spen

+0

現在這很奇怪,因爲'StringTokenizer'絕對不使用遞歸,調用堆棧深度將不依賴於掃描的字符串的長度。你確定在某個地方的調用代碼中沒有失控的遞歸嗎?你能從堆棧跟蹤中看到更多的幾行嗎? – biziclop