2011-02-13 66 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已經獲得的長度值() 。