返回Char Array的数组索引超出绑定异常

时间:2015-01-21 04:56:03

标签: java

我是Java编程的新手,我正在编写代码用%20替换字符串中的空格并返回最终的String。这是问题的代码。由于我是编程新手,请告诉我我做错了什么。抱歉我的英语不好。

package Chapter1;

import java.io.BufferedReader;
import java.io.InputStreamReader;


public class Problem4 {
public  char[] replaceSpaces(char[] str_array, int length)
{
    int noOfSpaces=0,i,newLength;
    for(i=0;i<length;i++)
    {
        if(str_array[i]==' ')
        {
            noOfSpaces++;
        }

        newLength = length + noOfSpaces * 2;
        str_array[newLength]='\0';
        for(i=0;i<length-1;i++)
        {
            if(str_array[i]==' ')
            {
                str_array[newLength-1]='0';
                str_array[newLength-2]='2';
                str_array[newLength-3]='%';
                newLength = newLength-3;
            }
            str_array[newLength-1]=str_array[i];
            newLength = newLength - 1;

        }
    }

    return str_array;

}
public static void main(String args[])throws Exception
{
    BufferedReader reader = new BufferedReader(new        InputStreamReader(System.in));
    System.out.println("Please enter the string:");
    String str = reader.readLine();
    char[] str_array = str.toCharArray();
    int length = str.length();
    Problem4 obj = new Problem4();
    char[] result = obj.replaceSpaces(str_array, length);
    System.out.println(result);
  }

}

但是我收到以下错误:

Please enter the string:
hello world
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11
at Chapter1.Problem4.replaceSpaces(Problem4.java:19)
at Chapter1.Problem4.main(Problem4.java:46)

5 个答案:

答案 0 :(得分:2)

如何使用String.replaceAll()

String str = reader.readLine();
str = str.replaceAll(" ", "02%");

示例code here

修改

问题出在第19行:

str_array[newLength]='\0';//<-- newLength exceeds the char array size

这里的数组是静态的,即大小是固定的,您可以使用StringBuilderStringBuffer等来构建新的String,而不必担心这些小操作的大小。

答案 1 :(得分:2)

假设您希望了解在实施方法时出现的错误,而不是寻找完全不同的方法:

(1)正如已经指出的,一旦分配了一个数组,它的大小就不能改变。您的方法将str_array作为参数,但生成的数组可能会大于str_array。因此,由于str_array的长度无法更改,因此您需要分配一个新数组来保存结果,而不是使用str_array。您已正确计算newLength;分配该大小的新数组:

char[] resultArray = new char[newLength];

(2)正如Elliott指出的那样,Java字符串不需要\0个终结符。如果出于某种原因,您确实想要创建一个末尾带有\0字符的数组,那么您必须将1添加到计算出的newLength以计算额外字符。

(3)您实际上是在向后创建结果数组。我不知道这是否是故意的。

        if(str_array[i]==' ')
        {
            str_array[newLength-1]='0';
            str_array[newLength-2]='2';
            str_array[newLength-3]='%';
            newLength = newLength-3;
        }
        str_array[newLength-1]=str_array[i];
        newLength = newLength - 1;

i从字符串的第一个字符开始向上;你填写从字符串的最后一个字符(newLength)开始并向后的字符。如果那是你打算做的,那么你的问题就不清楚了。您希望输出为"dlrow%20olleh"吗?

(4)如果 想要向后转,那么上面代码对空格的作用是将%20放入字符串(向后),但是然后它还将空间放入结果。如果输入字符是空格,则要确保不执行将输入字符复制到结果的两行。因此,您需要添加else。 (请注意,此问题会导致越界错误,因为您尝试将更多字符放入结果中而不是计算出来。)您需要有else个即使你真的打算构建字符串转发并需要改变逻辑以使其继续前进。

答案 2 :(得分:1)

Java数组不是动态的(它们是Object实例,并且它们具有不会更改的字段length属性。因为它们将长度存储为字段,所以知道它们不是'\0'终止是很重要的(您尝试添加这样的终结符会导致索引超出范围Exception)。您的方法似乎不访问任何实例字段或方法,因此我将其设置为静态。然后,您可以使用StringBuilderfor-each loop。像

这样的东西
public static char[] replaceSpaces(char[] str_array) {
    StringBuilder sb = new StringBuilder();
    for (char ch : str_array) {
        sb.append((ch != ' ') ? ch : "%20");
    }
    return sb.toString().toCharArray();
}

然后将其称为

char[] result = replaceSpaces(str_array);

最后,您可以按照@Arvind here的建议使用String str = reader.readLine().replace(" ", "+");replaceAll(" ", "%20")

P.S。当您最终得到result时,您需要修改对print的通话。

System.out.println(Arrays.toString(result));

System.out.println(new String(result));

char[]不是String,Java数组(令人失望)不会覆盖toString(),因此您将从Object获取该数据。

答案 3 :(得分:0)

此行str_array[newLength]='\0';引发了异常,因为newLength的值大于str_array的长度。

定义后,无法增加数组大小。所以尝试替代解决方案。

 char[] str_array1=Arrays.copyOf(str_array, str_array.length+1);
 str_array1[newLength]='\0';

不要忘记导入新包import java.util.Arrays;

答案 4 :(得分:0)

  

请告诉我我做错了什么

您尝试用三个字符替换单个字符%20。这是不可能的,因为数组是固定长度的。

因此,您必须分配一个新的char[]并将str_array中的字符复制到新数组中。

for (i = 0; i < length; i++) {
    if (str_array[i] == ' ') {
        noOfSpaces++;
    }
}

newLength = length + noOfSpaces * 2;
char[] newArray = new char[newLength];
// copy characters from str_array into newArray