2013-04-09 62 views
1

你能幫忙嗎?運行此程序時獲取錯誤Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: -1。如何修復rhis? StringBuffer和StringTokenizer是必需的。另外,如何更簡單地完成?索引超出範圍時刪除

import java.util.StringTokenizer; 

public class main { 
    public static int i, n; 
    public static boolean orly = false; 
    public static StringBuffer input, tokenStr; 
    public static StringTokenizer out; 
    public static char aChar; 

    public static void main(String[] args) { 
    input = new StringBuffer("some text"); 
    System.out.println("Начальная строка - " + input.toString()); 
    input = new StringBuffer(input.toString().replaceAll("[^a-z A-Z А-Я а-я]", "")); 
    if (input.toString().trim().length() != 0) { 
     out = new StringTokenizer(input.toString()); 
     System.out.println("Форматированая строка - " + input.toString()); 
     n = (out.countTokens()); 
     String[] charSet = { "a", "e", "o", "u", "y" }; 
     for (i = 0; i <= n - 1; i++) { 
     tokenStr = new StringBuffer(out.nextToken()); 
     aChar = (tokenStr.charAt(0)); 
     String firstchar = tokenStr.toString().substring(0,1); 
     if (tokenStr.length() > 1) { 
      for (int i = 0; i <= charSet.length-1; i++) { 
       if ((!firstchar.equals(charSet[i])) || (!firstchar.toUpperCase().equals(charSet[i]))) { 
       input.delete(input.indexOf(tokenStr.toString()),input.indexOf(tokenStr.toString())+ tokenStr.length() + 1); 
      } 
     } 
      } else { 
         input.deleteCharAt(input.indexOf(tokenStr.toString())); 
        } 
       } 
      } 
     } 
    } 
+0

哪一行你會得到錯誤? –

回答

0
for (i = 0; i <= n - 1; i++) { 
    //stuff 
    if (tokenStr.length() > 1) { 
    for (int i = 0; i <= charSet.length-1; i++) { 
     //stuff 
    } 
    } 
} 
在第一個for循環

,你有隻存在裏面的花括號中的臨時變量i。但是,在你的第二個for循環中,你正在創建另一個變量i。這我會覆蓋第一個,但仍然會在兩個循環中遞增。你最好將第二個重命名爲j或某個東西。

此外,在:

input.delete(input.indexOf(tokenStr.toString()),input.indexOf(tokenStr.toString())+ tokenStr.length() + 1); 

會發生什麼,如果tokenStr是不是在輸入?然後indexOf將返回-1(預定義的行爲),這導致這個特殊的異常。

  • 所以..我只需要刪除所有詞語的字符串,不從「A」,「E」,「O」,「U」,「Y」,「我」與一個字開始char(像我一樣)。並創建字符串與留言

考慮一種不同的方式。不要從輸出StringBuffer中刪除不需要的單詞,而是嘗試在輸出緩衝區中添加想要的單詞。您可以描述這種邏輯,使其沿着您的輸入字符串行進,並在您找到它們時寫下所需的字詞。

StringBuffer outString = new StringBuffer(); 
StringTokenizer st = new StringTokenizer(input.toString()); 
while(st.hasMoreTokens()){ 
    String currentToken = (String)st.nextToken(); 
    if(currentToken.length() < 2){ 
    continue; 
    } 
    for(int i = 0; i < charSet.length; i++){ 
    if(charSet[i] == currentToken.charAt(0)){ 
     outString.append(currentToken); 
     break; 
    } 
    } 
} 
+0

獲得相同結果 – antoxa2584

+0

您可能想要檢查自己的邏輯。你到底想用這個代碼來做什麼?請注意,tokenStr在第一輪刪除後不一定會輸入。 –

+0

但如何解決它? – antoxa2584