首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java相关 >

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space

2013-08-16 
Exception in thread main java.lang.OutOfMemoryError: Java heap space本帖最后由 xu357100870 于 201

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
本帖最后由 xu357100870 于 2013-06-23 00:34:29 编辑

public class Test {
//符号
private final char[] symbol = {'*','+','-','/','%','=','(',')','[',']','{','}',
'!','|','&',';','.','<','>'};
//数字
private final char[] number = {'0','1','2','3','4','5','6','7','8','9','.'};

private char ch;//存放新读进的字符
private String str;//存放要分析的句子
private StringBuffer strToken;//存放构成单词符号的字符串
private int i = 0;
public Test(String str){
this.str = str;
this.strToken = new StringBuffer();
}
//将下一字符读到ch中,并将指示器前移一字符位置
public void GetChar(){
if(i < str.length()){
ch =  str.charAt(i);
i++;
}

}
//判断是否为空格,若是则调用Getchar,直到ch进入下一个非空白字符
public void GetBC(){
while(i <= str.length()){
if(ch == ' '){
GetChar();
}else{
break;
}
//i++;
}
}
//将ck连接到strToken之后
public void Concat(){
strToken.append(ch);
}
//判断是ch否是数字还是字母
public boolean IsLetter(){
if( (ch >= 'a' && ch <= 'z') || (ch >= 'A' && ch <= 'Z')){
return true;
}else {
return false;


}
public boolean IsDigit(){
boolean b = false;
for (int k = 0; k < number.length; k++) {
if(ch == number[k]){//超前搜索
b = true;
//i++;
}
}
return b;

//是否是符号
public boolean isSymbol(){
boolean b = false;
//char temp = str.charAt(i);
for (int k = 0; k < symbol.length; k++) {
if(ch == symbol[k]){
b = true;
}
}
return b;
}
//将搜索指示器回调一个字符,将ch置为空白字符
public void Retract(){
i--;
ch = ' ';
}
public static void main(String[] args) {
Test test = new Test("for (int i = 0; i < idAL.size(); i++)");
while(true){
test.GetChar();
test.GetBC();
if(test.IsLetter()){//如果是字母
test.Concat();//加到strToken后面
test.GetChar();//得到下一个字符
while(test.IsLetter() || test.IsDigit()){//如果是字母或数字


test.Concat();//加到strToken后面
test.GetChar();//得到下一个字符
}if(!test.IsLetter()){//如果不是字母
test.Retract();//指示器前移一个位置,并将ch置为空
}
System.out.println("标识符:"+test.strToken.toString());
test.strToken.delete(0, test.strToken.length());//清空StringBuffer
}else if(test.IsDigit()){
test.Concat();
test.GetChar();
while(test.IsDigit()){
test.Concat();
test.GetChar();
}
if(!test.IsDigit()){
test.Retract();
}
System.out.println("数字:"+test.strToken.toString());
test.strToken.delete(0, test.strToken.length());
}else if(test.isSymbol()){
test.Concat();
test.GetChar();
while(test.isSymbol()){
test.Concat();
test.GetChar();
}
if(!test.isSymbol()){
test.Retract();
}
System.out.println("符号:"+test.strToken.toString());
test.strToken.delete(0, test.strToken.length());
}
if(test.i == test.str.length()){
System.exit(-1);
}
}

}

}


这是个简单的词法分析器,为什么不能遍历最后两个字符,而且一直有异常
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.util.Arrays.copyOf(Arrays.java:2882)
at java.lang.AbstractStringBuilder.expandCapacity(AbstractStringBuilder.java:100)
at java.lang.AbstractStringBuilder.append(AbstractStringBuilder.java:572)
at java.lang.StringBuffer.append(StringBuffer.java:320)
at Test.Concat(Test.java:37)
at Test.main(Test.java:106) Java
[解决办法]
 while(i <= str.length()){            if(ch == ' '){                GetChar();            }else{                break;            }            //i++;        } 


这个while的循环条件是i<=str.length(),GetChar()的判断条件是i<str.length() 是不是这的问题呢?
[解决办法]
引用:
Quote: 引用:

 while(i <= str.length()){            if(ch == ' '){                GetChar();            }else{                break;            }            //i++;        }

这个while的循环条件是i<=str.length(),GetChar()的判断条件是i<str.length() 是不是这的问题呢?

不是的,因为GetChar()里面有个i++的操作

不知道你这个ch=' '是什么意思,如果没有运行到else的break这里,这个while是个死循环

热点排行