使用字符串缓冲区时如何解决Java堆空间错误?

时间:2019-06-12 07:19:42

标签: java data-structures

在尝试执行此代码时出现以下错误,我无法弄清原因。它似乎与使用StringBuffer并附加到它有关。

代码:

class Stock {

    static String findStock(int[] arr) {
        int flag = 0;
        int begin = 0;
        int start = 0;
        int endIndex = 0;

        boolean foundStart = false;

        StringBuffer op = new StringBuffer();

        while (flag != 1) {

            //find start
            for (int i = begin; i < arr.length - 1; i++) {
                if (arr[i + 1] > arr[i]) {
                    start = arr[i];
                    endIndex = i;
                    foundStart = true;
                    break;
                }
                if (i == arr.length - 1) {
                    flag = 1;
                }
            }
            //find string

            while (arr[endIndex + 1] > arr[endIndex]) {
                endIndex++;
                if (endIndex == arr.length - 1) break;
            }
            int end = arr[endIndex];
            op.append("()");

        }
        return op.toString();
    }

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);

        int n = sc.nextInt();
        int[] arr = new int[n];

        for (int i = 0; i < n; i++) {
            arr[i] = sc.nextInt();
        }

        String output = findStock(arr);
        System.out.println(output);
    }
}

错误:

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
    at java.util.Arrays.copyOf(Arrays.java:3332)
    at java.lang.AbstractStringBuilder.ensureCapacityInternal(AbstractStringBuilder.java:124)
    at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:448)
    at java.lang.StringBuffer.append(StringBuffer.java:270)
    at Stock.findStock(Stock.java:43)
    at Stock.main(Stock.java:61)

1 个答案:

答案 0 :(得分:5)

您的while循环永远不会结束,因为flag永远不会是1

请参见for循环中的条件:i<arr.length-1

i==arr.length-1永远不会正确。

您的StringBuffer将不断添加内容,直到获得OutOfMemoryError为止。

for(int i=begin; i<arr.length-1; i++){
...
 if(i==arr.length-1){
    flag = 1;
 } 

}