2011-04-18 35 views
0

我有一個小程序可以計算詞位。我得到的是一個錯誤。我對Java相當陌生。以下是錯誤:Count lexemes - 字符串越界異常

c:\programming>java LexemesTokenizer 
input string: a = ++b; c = d - /* -e */ --f; 
Input string= a 
Delimeter= . 
Total number of delimeters= 2 Exception in thread "main" java.lang.StringIndexOu 
tOfBoundsException: String index out of range: 2 
    at java.lang.String.charAt(Unknown Source) 
    at LexemesTokenizer.main(LexemesTokenizer.java:41) 

這裏是代碼

import java.util.Scanner; 

public class LexemesTokenizer { 

    public static void main(String[] args) { 

     Scanner scanner = new Scanner(System.in); 

     System.out.print("input string: "); 
     String s = scanner.next(); 

     char delimiter = ' '; 

     // calculate number of delimiter characters 
     int cntDelimeters = 0; 
     for (int i = 0; i < s.length(); i++) { 
      if (s.charAt(i) != delimiter) { 
       cntDelimeters++; 
      } 
     } 

     System.out.println("Input string= " + s); 
     System.out.printf("Delimeter= %c.", delimiter); 
     System.out.printf("\nTotal number of delimeters= %d ", cntDelimeters); 
     String[] lexemes = new String[cntDelimeters + 1]; 

     // parse cntDelimeters+1 lexemes and store in an array 
     int right = 0; 
     int left = 0; 

     for (int i = 0; i < cntDelimeters; i++) { 
      while (s.charAt(right) != delimiter) { 
       right++; 
      } 

      lexemes[i] = s.substring(left, right); 
      right++; 
      left = right; 
     } 

     lexemes[cntDelimeters] = s.substring(right, s.length()); 

     // print results for testing 
     for (int i = 0; i < lexemes.length; i++) { 
      System.out.printf("\n%d : %s", i, lexemes[i]); 
     } 
    } 
} 

線41:而(!s.charAt(右)=分隔符){

一些字符串s的原因是隻有一個

任何幫助,非常感謝。

+0

你指出線41請爲我們,所以我們不必算? – 2011-04-18 02:26:33

+0

在你說你「/ /計算分隔符字符數」的部分,你似乎在計算實際上不是分隔符的字符數。在遞增「cntDelimiters」變量之前查看您使用的比較。不知道,如果這與你的錯誤有任何關係。 – Cephron 2011-04-18 02:36:00

+0

@Greg - 我添加了第41行。謝謝 – Steller 2011-04-18 02:42:41

回答

1

那麼,你的字符串(s)不包含一個空格,然後你這樣做(您分配給delimiter值):

while (s.charAt(right) != delimiter) { 
    right++; 
} 

因此飛馬上你的字符串的結尾。

while (s.charAt(right) != delimiter && s.length > right) 

會照顧到這一點。

編輯:爲了幫助輸入字符串

你打電話

String s = scanner.next(); 

Scanner是輸入解析器。這將返回輸入的第一個單詞(「a」),因爲默認分隔符是空格。

如果你想輸入的整條生產線使用:

String s = scanner.nextLine(); 
+0

我遇到同樣的問題。輸入字符串只是一個字符出於某種原因 – Steller 2011-04-18 02:41:50

+0

我加了41行,所以你可以看到錯誤來自哪裏 – Steller 2011-04-18 02:45:19

+0

我已經告訴過你錯誤來自哪裏以及爲什麼。 – 2011-04-18 02:50:14