2011-02-13 107 views
-1

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

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) 
+2

您是否尝试了解错误,以及它为什么会出现?到目前为止您的结论是什么? – bzlm 2011-02-13 19:46:25

+4

@Rebecca出于好奇,你是Umass Amherst的CS 121学生吗? – GobiasKoffi 2011-02-13 19:51:48

回答

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
sum = sum + (int)s.charAt(c); 

你的意思

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

您正在尝试获得字符在字符串中,S,在指数C,这是在pos字符的ASCII值。

什么,似乎你打算做的是C的整数值添加到总和,如果是,你应该有

sum += (int)c; 

由于C已经是你想要的字符,所以没有需要重新访问它。

另外,您可能打算让System.out.println超出for循环。

0

它看起来像

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

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

自97年已经是C,可刚说

sum = sum + c; 

还要注意的是letterCount不是非常有用,因为它计算的字符串,它是由s.length已经获得的长度值() 。