Exception in thread "main"...哪错了?

小小纳爱斯 2011-04-22 08:38:29
错误信息:
(453,11)
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 8
at java.lang.String.charAt(String.java:687)
at LexicalAnalysis.main(LexicalAnalysis.java:23)

代码:

import java.util.*;
public class LexicalAnalysis
{
public static void main(String[] args){

TypeCode.evaluate();
String sentence="453 name";
String str="";

for(int i=0;i<sentence.length();i++){
if(isDigit(sentence.charAt(i))){
str=str+sentence.charAt(i);
while((i<sentence.length()-1) & isDigit(sentence.charAt(i+1))){
i++;
str=str+sentence.charAt(i);
}

System.out.println("("+str+","+TypeCode.typeCode.get("digitdigit*")+")");
str="";
}
else if(isLetter(sentence.charAt(i))){
str=str+sentence.charAt(i);
while(i<sentence.length()-1 & (isLetter(sentence.charAt(i+1))|| isDigit(sentence.charAt(i+1))) ){
i++;
str=str+sentence.charAt(i);
}

System.out.println("("+str+TypeCode.typeCode.get("letter(letter|digit)*")+")");
str="";

}
else if(sentence.charAt(i)==' ')
i++;

}

}

public String analysis(String sentence){

return sentence;
}

public static boolean isDigit(char a){
if(a>='0' & a<='9' ){
return true;
}
else
return false;
}

public static boolean isLetter(char a){
if((a>='A' && a<='Z') || (a>='a' && a<='z') ){
return true;
}
else
return false;
}


}
class TypeCode
{
public static Hashtable<String,Integer> typeCode= new Hashtable<String,Integer>(30);
public static void evaluate(){
typeCode.put("#", 1);
typeCode.put("begin", 2);
typeCode.put("if", 3);
typeCode.put("then", 4);
typeCode.put("while", 5);
typeCode.put("do", 6);
typeCode.put("end", 7);
typeCode.put("letter(letter|digit)*", 10);
typeCode.put("digitdigit*", 11);
typeCode.put("+", 13);
typeCode.put("-", 14);
typeCode.put("*", 15);
typeCode.put("/", 16);
typeCode.put(":", 17);
typeCode.put(":=", 18);
typeCode.put("<", 20);
typeCode.put("<>", 21);
typeCode.put("<=", 22);
typeCode.put(">", 23);
typeCode.put(">=", 24);
typeCode.put("=", 25);
typeCode.put(";", 26);
typeCode.put("(", 27);
typeCode.put(")", 28);
}

}
...全文
142 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
lang_love_java 2011-04-22
  • 打赏
  • 举报
回复
&& 具有短路性,只要前面的条件不正确,将判断后面的条件,返回结果为false
lang_love_java 2011-04-22
  • 打赏
  • 举报
回复
这里涉及到 & 与 && 的区别:
&& 具有短路性,只要前面的条件不正确,将判断后面的条件,返回结果为false
如果前面的条件正确,才去判断后面的条件。
& 不具有短路性,也就是不管前面的条件正确与否,都判断后面的条件,就是因为这点,你的程序出错了

你应该将while (i < sentence.length() - 1 & (isLetter(sentence.charAt(i + 1)) || isDigit(sentence.charAt(i + 1)))) 中的 & 改用为 &&;
kai27ks 2011-04-22
  • 打赏
  • 举报
回复
字符串数组下表越界了。
String sentence="453 name";
一共8个字符,数组下标从0开始,最大不能超过7.

50,528

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧