2013-12-12 26 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