2013-12-12 64 views
0

先生在這裏,我試圖檢查是否有任何數字是否存在或不存在。如果存在任何數字,則會打印該數字。但是當我試圖運行這個代碼時,我面臨着錯誤。請幫我解決這個錯誤。Java String索引出界

我的代碼

import java.util.Scanner; 
public class test1{ 
    public static void main (String[] args){ 
    Scanner input = new Scanner(System.in); 
    int a = input.nextInt(); 
    String arr[]= new String[a]; 
    for(int i=0;i<a;i++){ 
     arr[i]=input.next(); 
    } 
    for(int i=0;i<a;i++){ 
     String sub[] = arr[i].split(""); 
     for(int j=0;j<sub.length;j++){ 
      char x = arr[i].charAt(j); 
      if(Character.isDigit(x)){ 
       System.out.println(x); 
      } 
     } 
    } 
    } 
} 

我收到此錯誤:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 4 
    at java.lang.String.charAt(String.java:686) 
    at test1.main(test1.java:13) 
Java Result: 1 

你可以幫我解決這個問題。

+0

我不太瞭解java,但是'arr [i] = input.next();當你的循環到達它的結尾時,你的下一個輸入是不存在的。因此錯誤。雖然我不確定。 – PythonEnthusiast

+0

是否可以用'「」分割給出額外的不需要的空白字符? –

+0

@peeskillet - 這正是發生的事情。 split方法返回的數組中有一個額外的元素,它是空的,因此'charAt()'在該String中沒有遇到任何字符時拋出'StringIndexOutOfBoundsException'。 – SudoRahul

回答

3

而不是使用String.split的,將您的字符串轉換成字符數組:

try (Scanner input = new Scanner(System.in)) { 
    System.out.print("Enter number of strings: "); 
    int a = input.nextInt(); 

    String arr[] = new String[a]; 
    for (int i = 0; i < a; i++) { 
    System.out.print(String.format("Enter string #%d: ", i + 1)); 
    arr[i] = input.next(); 
    } 

    for (int i = 0; i < a; i++) { 
    for (char c : arr[i].toCharArray()) { 
     if (Character.isDigit(c)) { 
     System.out.println(c); 
     } 
    } 
    } 
} 

注:我把你的Scanner在一個try-與資源建設,因爲你沒有正確關閉它。

實例:

Enter number of strings: 3 
Enter string #1: abc 
Enter string #2: 1abc 
Enter string #3: a1b2c3 
1 
1 
2 
3 
+2

+1最好的方式來解決和改進它! – bobbel

0

變化

for(int j=0;j<sub.length;j++) 

for(int j=0;j<sub.length-1;j++) 

我測試了它和它的作品如預期:)

那是因爲sublength是5當輸入字符串的長度例如:輸入hello的長度爲5,之後做split("")它的長度爲6,因爲它是""+"h"+"e"+"l"+"l"+"o"在數組中。因此,在sub字符串是數組:)

+0

其工作謝謝.. –

+0

我給樣品輸出 –

2

使用string.lenght()比字符串一個索引更大:

String sub[] = new String[arr[i].lenght()]; 
      for(int j=0;j<arr[i].length();j++){ 
       char x = arr[i].charAt(j); 
       if(Character.isDigit(x)){ 
       System.out.println(x); 
      } 
} 

編輯:數組sub[]甚至沒有使用,因此它不具有完全被宣佈。

+1

@Prabhakaran不在陣列但ARR [我]返回一個字符串.. –

0

如果使用String.split("")直接建立一個字符串[]陣列。第一個是空的。

例如,我們分割字符串「123」,您將獲得一個String []數組作爲[,1,2,3],而不是[1,2,3]

String[] text = "123".split(""); 
//[, 1, 2, 3] 
System.out.println(Arrays.toString(text)); 

這個額外的空是異常的原因:StringIndexOutOfBoundsException:

可以跳過第一個空字符串,並從而不是開始的索引。

更改下面的代碼

for(int i=0;i<a;i++){ 
     String sub[] = arr[i].split(""); 
     for(int j=0;j<sub.length;j++){ 
      char x = arr[i].charAt(j); 
      if(Character.isDigit(x)){ 
      System.out.println(x); 
      } 
     } 
    } 

for(int i=0;i<a;i++){ 
     String sub[] = arr[i].split(""); 
     for(int j=1;j<sub.length;j++){ 
      char x = arr[i].charAt(j-1); 
      if(Character.isDigit(x)){ 
      System.out.println(x); 
      } 
     } 
    } 

,你會得到預期的結果,通過實例運行如下:

2 
12dec 
34 
1 
2 
3 
4