“从列表中检查值”程序中的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);
}
有没有可能发生的优化或其他建议的方法?
在此先感谢。
答
我终于设法找到了我的代码中的错误。谢谢大家的回答,他们帮助了我很多。问题出现在每个人都提到的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)
当你的代码进入while循环时,它似乎会一直呆在那里直到你的内存耗尽。 –
这是我的想法,但这是由于代码中的错误导致无限循环,或者它只是消耗太多内存才能找到满足条件的正确索引? –
你的代码肯定有错误。在else if(j == 2)块中调试最后一个while循环。我猜想这个循环运行无限。 我无法自己调试,因为您没有发布包括所需变量和导入在内的整个代码。 – DiabolicWords