java - 使用字符串缓冲区时如何解决 Java 堆空间错误?
问题描述
尝试执行此代码时出现以下错误,我无法弄清楚原因。它似乎与使用 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)
解决方案
你的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;
}
}
推荐阅读
- python - 将列类型编辑为固定宽度的字符串(在现有的 Pandas 数据框中)
- windows - Linker error when compiling windows kernel mode driver x64
- visual-studio - How to fix Resource versus Resources error in Xamarin - Visual Studio
- apache - Apache excute Rewrite Rule if URI doesn't start with strings
- css - CSS file only updating on renaming on Apache server
- mysql - 在mysql查询中重新输入别名列
- php - 如何在 Voyager 中编辑/添加数据到 HasOne 关系字段?
- c# - 在 DomainUpDown 控件中阻止粘贴事件
- python - 如何通过单击网页按钮从文件夹中删除或下载所需的文档?
- javascript - 递归子集和 - 我做错了什么?