如何解决此运行时错误?

时间:2017-02-22 16:21:57

标签: java arrays oop runtime-error

我正在尝试创建一个java程序,它将查找并删除字符串中的重复字符。就像用户输入“baloon”一样,输出应该是“balon”。我使用String变量作为输入并将其内容复制到Char数组,以便我可以分析每个字符。我得到ArrayIndexOutOfBoundsException。这是我的代码

class doubleKiller{

private String inputStr = " ";
private char[] catchStr = new char[inputStr.length()];
private String modifiedStr;

//Accessor method
public void getString(String inputStr)
{
    this.inputStr = inputStr;
}

public String killRepeater()
{

    //copying string data to char array
    this.inputStr.getChars(0 , this.inputStr.length() , catchStr , 0);

    //------------------

    for(int counter = 0 ; counter < this.inputStr.length() ; counter++)
    {
        if(catchStr[counter] != catchStr[counter - 1])
        {
            modifiedStr = modifiedStr + catchStr[counter];
        }
    }

    return modifiedStr;
}

}

这是调用killRepeater()时的输出。

java.lang.ArrayIndexOutOfBoundsException: src.length=5 srcPos=0 dst.length=1 dstPos=0 length=4

at java.lang.System.arraycopy(Native Method)
at java.lang.String.getChars(String.java:894)   
at doubleKiller.killRepeater(Main.java:23)
    at useThings.main(Main.java:49) 
at java.lang.reflect.Method.invokeNative(Native Method) 
at java.lang.reflect.Method.invoke(Method.java:515) 
at com.aide.ui.build.java.RunJavaActivity$1.run(SourceFile:108) 
at java.lang.Thread.run(Thread.java:862)

告诉我我的错误...提前致谢

3 个答案:

答案 0 :(得分:2)

你在做什么

private String inputStr = " "; 
private char[] catchStr = new char[inputStr.length()];

inputStr.length()返回1,即字符串中的大小&#34; &#34;,所以,你有一个 char数组,大小为1

当你这样做时:

for(int counter = 0 ; counter < this.inputStr.length() ; counter++){
    if(catchStr[counter] != catchStr[counter - 1]){

使用inputStr.length() > 1,您有ArrayIndexOutOfBoundsException

此外,首次运行catchStr[counter - 1])时,counter-1会生成-1,这不是有效索引。尝试从counter运行1以避免此错误。

使用固定大小(例如200)声明您的数组或使用ArrayList。您也可以在输入字符串后输入catchStr = new char[inputStr.length()]

答案 1 :(得分:0)

您正在使用inputStr.length()初始化catchStr。但此时inputStr =&#34; &#34 ;.因此,catchStr的长度为1.当您稍后将inputStr填充到更大的值时,您尝试将其复制到长度为1的char []中,并且它不适合。在复制之前添加catchStr = new char[inputStr.length()];

答案 2 :(得分:0)

初始化catchStr时,其值始终为1,因为inputStr" ",因此其长度为1。

private String inputStr = " ";
private char[] catchStr = new char[inputStr.length()];

当您在方法counter中循环killRepeater()时,您将获得ArrayOutOfBoundsException,因为您在getString中传递的字符串可能大于1。

考虑将new char[inputStr.length()]移至getString

public void getString(String inputStr) {
    this.inputStr = inputStr;
    this.catchStr = new char[inputStr.length()];
}

并且,将属性catchStr设置为未初始化。

private char[] catchStr;

第二个问题是你的for循环。您从0开始counter并使用catchStr[counter - 1]回顾前一个字符。这在counter = 0时不起作用,因为索引将评估为-1。

考虑从1开始counter,然后从那里继续处理该方法。您需要稍微调整它以使其输出所需的字符串。

for (int counter = 1; counter < this.inputStr.length(); counter++) {
    if (catchStr[counter] != catchStr[counter - 1]) {
        modifiedStr = modifiedStr + catchStr[counter];
    }
}