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

时间:2017-02-26 16:54:57

标签: java arrays memory arraylist cpu-usage

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

是否有可能发生的优化或任何其他建议的方法?

提前致谢。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:1)

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

现在程序正常运行。