2017-02-26 34 views
0

我創建了一個簡單的程序,用於從列表中讀取一些值並僅保留指定長度的值,並從中提取3個字符,但從不同的位置時間。「從列表中檢查值」程序中的Java堆空間錯誤

例如,如果我們有nick07n程序中的值應該從中提取三個隨機字符可能是相同的,但不是來自同一個位置拍攝:

n0n [0, 4, 6] 

當程序運行正常(我」已經看到一些成果),未成功執行的整個過程,直到結束或者根本沒有執行,因爲我收到以下的內存錯誤:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
at java.util.Arrays.copyOf(Unknown Source) 
at java.util.Arrays.copyOf(Unknown Source) 
at java.util.ArrayList.grow(Unknown Source) 
at java.util.ArrayList.ensureExplicitCapacity(Unknown Source) 
at java.util.ArrayList.ensureCapacityInternal(Unknown Source) 
at java.util.ArrayList.add(Unknown Source) 
at guessingTool.CheckProgram.main(CheckProgram.java:103) 

這裏是我的代碼至今:

for (int i = 0; i < 5; i++) { 

     index = randomGenerator.nextInt(valuesList.size()); 
     value = valuesList.get(index); 

     finalValue = ""; 
     positions.clear(); 
     for (int j = 0; j < 3; j++) { 
     index = randomGenerator.nextInt(value.length()); 
     valueChar = value.charAt(index); 
     positions.add(index); 

     if (j == 0) { 
      finalValue += Character.toString(valueChar); 
     } 
     else if (j == 1) { 
      if (positions.get(0) != positions.get(1)) { 
       finalValue += Character.toString(valueChar); 
      } 
      else { 
       while (positions.get(0) == positions.get(1)) { 
        index = randomGenerator.nextInt(value.length()); 
        valueChar = value.charAt(index); 
        positions.add(index); 
       } 
      } 
     } 
     else if (j == 2) { 
      if (positions.get(0) != positions.get(2) && positions.get(1) != positions.get(2)) { 
       finalValue += Character.toString(valueChar); 
      } 
      else { 
       while (positions.get(0) == positions.get(2) || positions.get(1) == positions.get(2)) { 
        index = randomGenerator.nextInt(passcode.length()); 
        valueChar = value.charAt(index); 
        positions.add(index); 
       } 
      } 
     } 

     } 
     System.out.println(finalValue + " " + positions); 
} 

有沒有可能發生的優化或其他建議的方法?

在此先感謝。

+0

當你的代碼進入while循環時,它似乎會一直呆在那裏直到你的內存耗盡。 –

+0

這是我的想法,但這是由於代碼中的錯誤導致無限循環,或者它只是消耗太多內存才能找到滿足條件的正確索引? –

+0

你的代碼肯定有錯誤。在else if(j == 2)塊中調試最後一個while循環。我猜想這個循環運行無限。 我無法自己調試,因爲您沒有發佈包括所需變量和導入在內的整個代碼。 – DiabolicWords

回答

0

我終於設法找到了我的代碼中的錯誤。謝謝大家的回答,他們幫助了我很多。問題出現在每個人都提到的while循環中。

我改變了這個:

else { 
     while (positions.get(0) == positions.get(1)) { 
      index = randomGenerator.nextInt(value.length()); 
      valueChar = value.charAt(index); 
      positions.add(index); 
     } 
}  

要這樣:

else { 
    while (positions.get(0) == index) { 
      index = randomGenerator.nextInt(value.length()); 
    } 
    valueChar = value.charAt(index); 
    positions.add(index); 
    finalValue += Character.toString(valueChar); 
} 

現在該程序正常工作。

2

我認爲你的問題來自於你的代碼的一部分,看起來像這樣:

while (positions.get(0) == positions.get(1)) { 
        index = randomGenerator.nextInt(value.length()); 
        valueChar = value.charAt(index); 
        positions.add(index); 
    } 

如果條件爲真會發生什麼事,是你附加在你位置結束列表中的索引( positions.add(index)不會推動索引,它只是附加在列表的末尾),但是條件仍然成立,所以你有一個無限循環,在列表中添加越來越多的元素,並且在一些指出你沒有足夠的堆來保存所有這些。見Javadoc https://docs.oracle.com/javase/7/docs/api/java/util/List.html#add(E)