Java“字符串索引超出范围”

时间:2011-02-13 19:43:00

标签: java

下面的程序应该找到字符串中的平均字母。例如:“abc”的平均值是“b”。当我运行程序时,我收到以下错误消息。谢谢你的帮助!
计划:

import java.util.*;
public class AvLetter{
public static void main(String[] args){
Scanner scan = new Scanner(System.in);
System.out.println("enter a phrase");
String s = scan.nextLine();
s = s.toLowerCase();
int letterCount = 0; int sum = 0; char c;

for(int pos= 0; pos< s.length(); pos++){ 
  c=s.charAt(pos);
  if  (Character.isLetter(c)) {
  sum = sum + (int)s.charAt(c);
  letterCount++;
  System.out.println((char)(sum/letterCount));
  }
}
}
}

错误消息:

java.lang.StringIndexOutOfBoundsException: String index out of range: 97
    at java.lang.String.charAt(String.java:686)
    at AvLetter.main(AvLetter.java:14)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:597)
    at edu.rice.cs.drjava.model.compiler.JavacCompiler.runCommand(JavacCompiler.java:271)

4 个答案:

答案 0 :(得分:8)

java.lang.StringIndexOutOfBoundsException: String index out of range: 97 at
java.lang.String.charAt(String.java:686) at AvLetter.main(AvLetter.java:14) at
...

堆栈跟踪告诉你第14行出了问题(在你上面发布的第13行)。第14行是什么?你期望那个方法调用做什么,文档说它实际上做了什么?与在第12行使用它相比,你在第14行使用它有意义吗?

答案 1 :(得分:1)

sum = sum + (int)s.charAt(c);
你的意思是

sum = sum + (int)s.charAt(pos);

答案 2 :(得分:1)

你试图在索引c处获取字符串s中的字符,这是pos处字符的ASCII值。

你打算做的是将c的整数值加到总和上,如果是,你应该

sum += (int)c;

因为c已经是你想要的角色,所以不需要重新访问它。

此外,您可能打算将System.out.println置于for循环之外。

答案 3 :(得分:0)

看起来像是

sum = sum + (int)s.charAt(c);

是错误。 “c”是你角色的值(在你的测试用例中,结果是97),这显然不在你的String的范围内(如果你正在测试像abc这样的东西)。

由于97已经是c的值,你可以说

sum = sum + c;

另请注意,letterCount不是很有用,因为它计算了String的长度,这可以通过s.length()获得。