Java String索引超出范围

时间:2013-12-12 12:11:11

标签: 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

请你帮我解决这个问题。

4 个答案:

答案 0 :(得分: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-with-resources构造中,因为您没有正确关闭它。

使用示例:

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

答案 1 :(得分: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[]甚至没有使用,因此根本不需要声明它。

答案 2 :(得分:0)

更改

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

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

我测试了它并按预期工作:)

这是因为当输入字符串的长度为4时,length的{​​{1}}为5.例如:input sub的长度为5,并且在{{1}之后它的长度为6,因为它在数组中是hello。所以split("")中的String是一个比数组中String更大的索引:)

答案 3 :(得分:0)

如果直接使用String.split("")构建 String [] 数组。第一个是空的。

让我们分割字符串“123”,例如,您将获得一个String []数组作为[,1,2,3],而不是[1,2,3]

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

这个额外的空白是异常的原因:StringIndexOutOfBoundsException:

您可以跳过第一个空字符串,并从 1 而不是 0 开始索引。

更改以下代码

来自

   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