NetBeans堆空间错误修复求助:代码引发的内存溢出问题
问题分析与修复方案
核心问题:无限循环导致堆内存耗尽
你的Reverse()方法存在死循环:while(copy.isEmpty()==false)会持续执行,每次循环都调用stack.StringToStack(copy)将整个字符串反复压入栈,栈的大小会无限制增长,最终耗尽堆内存触发空间错误。同时StringToStack()的循环条件有误,会漏掉字符串的最后一个字符。
具体修复步骤
1. 修复StringToStack()的循环条件
原代码i < inStr.length() - 1会跳过最后一个字符,修改为i < inStr.length()才能遍历所有字符:
public void StringToStack(String inStr){ for(int i = 0; i < inStr.length(); i++){ // 移除-1,遍历全部字符 Character a = inStr.charAt(i); if(Character.isLetter(a)){ myCharacters.push(a); } } }
2. 重构Reverse()方法,消除死循环
原逻辑完全错误,正确的栈反转逻辑应该是逐个处理原栈元素,而非反复压入整个字符串。以下提供两种实现方案:
方案一:保留原栈数据的反转实现
如果需要原栈myCharacters保持不变,先复制原栈元素到临时结构,再反转压入新栈:
public CharStack Reverse(){ if(myCharacters.isEmpty()){ System.out.println("ERROR: Stack is empty"); return null; } // 临时存储原栈元素,避免修改原栈 List<Character> tempList = new ArrayList<>(); while(!myCharacters.isEmpty()){ tempList.add(myCharacters.pop()); } // 将元素放回原栈 for(int i = tempList.size()-1; i >=0; i--){ myCharacters.push(tempList.get(i)); } // 创建反转栈 CharStack reversedStack = new CharStack(); for(Character c : tempList){ reversedStack.myCharacters.push(c); } return reversedStack; }
方案二:不保留原栈数据的高效反转实现
如果反转后不需要原栈的数据,可以直接弹出原栈元素压入新栈:
public CharStack Reverse(){ if(myCharacters.isEmpty()){ System.out.println("ERROR: Stack is empty"); return null; } CharStack reversedStack = new CharStack(); while(!myCharacters.isEmpty()){ reversedStack.myCharacters.push(myCharacters.pop()); } return reversedStack; }
3. 额外优化建议
- 处理大文件时,逐行处理后及时释放不再使用的对象,避免内存堆积。
- 检查
CharStack的toString()方法实现,确保返回的是预期的纯字符序列,避免因格式问题引发其他错误。
内容的提问来源于stack exchange,提问作者Kodie Haas
相关产品推荐
相关产品推荐

