“从列表中检查值”程序中的Java堆空间错误

问题描述:

我创建了一个简单的程序,用于从列表中读取一些值并仅保留指定长度的值,并从中提取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

我终于设法找到了我的代码中的错误。谢谢大家的回答,他们帮助了我很多。问题出现在每个人都提到的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); 
} 

现在该程序正常工作。

我认为你的问题来自于你的代码的一部分,看起来像这样:

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)