Java "value checking from list" 程序中的堆 space 错误
Java heap space error in "value checking from list" program
我创建了一个简单的程序来从列表中读取一些值并仅保留指定长度的值,并从中提取 3 个字符,但每次都从不同的位置提取。
例如,如果我们有值 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 (positions.get(0) == positions.get(1)) {
index = randomGenerator.nextInt(value.length());
valueChar = value.charAt(index);
positions.add(index);
}
如果条件为真,您会在 positions 列表的末尾追加索引(positions.add(index) 不会推送索引,它只是附加在列表的末尾),但条件仍然成立,所以你有一个无限循环,在你的列表中添加越来越多的元素,并且在某些时候你没有足够的堆来容纳所有他们中的。请参阅 Javadoc https://docs.oracle.com/javase/7/docs/api/java/util/List.html#add(E)
我终于找到了代码中的错误。谢谢大家的回答,对我帮助很大。正如大家提到的,问题出在 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);
}
现在程序可以正常运行了。
我创建了一个简单的程序来从列表中读取一些值并仅保留指定长度的值,并从中提取 3 个字符,但每次都从不同的位置提取。
例如,如果我们有值 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 (positions.get(0) == positions.get(1)) {
index = randomGenerator.nextInt(value.length());
valueChar = value.charAt(index);
positions.add(index);
}
如果条件为真,您会在 positions 列表的末尾追加索引(positions.add(index) 不会推送索引,它只是附加在列表的末尾),但条件仍然成立,所以你有一个无限循环,在你的列表中添加越来越多的元素,并且在某些时候你没有足够的堆来容纳所有他们中的。请参阅 Javadoc https://docs.oracle.com/javase/7/docs/api/java/util/List.html#add(E)
我终于找到了代码中的错误。谢谢大家的回答,对我帮助很大。正如大家提到的,问题出在 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);
}
现在程序可以正常运行了。