数组索引越界 返回字符数组的异常



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

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]='';
        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)

如何使用String.replaceAll()

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

此处的示例代码

编辑

问题出在第 19 行:

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

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

假设你想看看你在实现你的方法时犯了什么错误,而不是寻找一个完全不同的方法:

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

char[] resultArray = new char[newLength];

(2)正如 Elliott 指出的,Java 字符串不需要终止符。 如果出于某种原因,您确实想创建一个末尾有字符的数组,则必须在计算newLength中添加 1 以考虑额外的字符。

(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

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

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的建议使用String str = reader.readLine().replace(" ", "+");replaceAll(" ", "%20")

附言当您最终获得result时,您需要修复您的电话以print它。

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

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

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

请告诉我我做错了什么

您尝试将单个字符替换为三个字符char[] 。这是不可能的,因为数组是固定长度的。

因此,您必须分配新的str_array[newLength]='';并将字符从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

此行中引发异常newLength因为 str_array 的值大于 import java.util.Arrays; 的长度。

数组大小一经定义就无法增加。因此,请尝试替代解决方案。

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

不要忘记导入新包CC_39

最新更新