2015-07-04 146 views
-2

我只是想創建一個可以將自然語言轉換爲sql查詢的應用程序,在這個片段中我想從給定的字符串中提取數字。我不是爲什麼我得到這個錯誤。不管長度如何,我都會輸入相同的錯誤結果。字符串索引超出範圍:java

public void insert(String low) { 
    String character = low; 
    int l = low.length(); 
    int j[] = new int[20]; 
    int m = 0; 

    for (int k = 0; k <= 2; k++) { 
     for (int i = 0; i <= l; i++) { 
      char c = character.charAt(i); 
      if (Character.isDigit(c)) { 
       String str = Character.toString(c); 
       j[k] = (j[k] * 10) + Integer.parseInt(str); 
       m++; 

      } else if (Character.isLetter(c)) { 
       if (m > 2) { 
        break; 
       } 
      } 
     } 
    } 

    for (int k = 0; k <= 2; k++) { 
     jTextField2.setText(Integer.toString(j[k])); 
    } 
} 

public void check(String low) { 
    int j; 
    String[] ins = {"into", "add", "insert"}; 
    String cc = low; 

    for (int i = 0; i < 2; i++) { 
     String dd = ins[i]; 
     if (cc.contains(dd)) { 
      j = 1; 
      insert(cc); 
      break; 
     } 
    } 
} 
+0

當引發異常時,根據調試器程序的狀態如何? –

+1

你可以縮進你的代碼嗎? 你在'insert'函數中輸入'low'是什麼? – Karthik

+0

你正在解析的字符串的格式是什麼?你能提供一個例子嗎? – Aderis

回答

0

變化

for(int i=0;i<=l;i++) 
{ 
    char c = character.charAt(i); 
    .......... 
} 

for(int i=0;i<l;i++) 
{ 
    char c = character.charAt(i); 
    .......... 
} 

當你寫i<=l,循環的最後一次迭代會執行character.chatAt(l),這是不存在的,因爲索引從0只啓動0,1,2, .....l-1個字符可用。因此執行character.chatAt(l)會拋出IndexOutofBound異常,這是不言自明的。

+0

謝謝,但現在最終的結果現在顯示爲0.讓您調試整個事情。我可以知道爲什麼這種變化使代碼正確的原因 –

+0

我編輯了答案。 – Karthik

0

如果您嘗試提取字符串中的所有數字,我強烈建議使用regular expressions而不是編寫自己的代碼來循環字符。怎麼樣是這樣的:

public List<Integer> extractNumbers(String line){ 
    // Construct regex 
    Pattern digitsPattern = Pattern.compile("\\d+"); 
    Matcher m = digitsPattern.matcher(line); 

    // Compile into list 
    List<Integer> numberList = new ArrayList<Integer>(); 
    while (m.find()){ 
     numberList.add(Integer.parseInt(m.group())); 
    } 

    return numberList; 
} 

正則表達式非常強大,成熟典雅的 - 當你看到這裏,你可以在幾個非常簡單的線條做到這一點,如果你需要更改匹配規則你會有一個更簡單的工作。

相關問題