字符串索引超出范围

时间:2013-04-22 14:09:18

标签: java string char

这是我添加到二进制字符串的代码,我在res字符串中得到了正确的值,但它仍然在执行结束时给出了异常。 字符串m1& m2的长度等于28。 我仍然尝试运行循环10次以验证但错误仍然存​​在。 这适用于i的任何值,而不管两个字符串的大于或小于实际长度。

public static String addMantissa(String m1,String m2)
{
    String res=" ";
    int c=0;
    System.out.println("Length is " + m2.length());
    int i=0;
    while(i < m2.length())
    {
        System.out.print(" " + res.charAt(i));
        if(m1.charAt(i)=='1' && m2.charAt(i)=='1')
        {
            if(c==0)
            {
                res+="0";
                c=1;
            }
            else
            {
                res+="1";
                c=1;
            }
        }

        if(m1.charAt(i)=='1' && m2.charAt(i)=='0')
        {
            if(c==0)
            {
                res+="1";
                c=0;
            }
            else
            {
                res+="0";
                c=1;
            }
        }

        if(m1.charAt(i)=='0' && m2.charAt(i)=='1')
        {
            if(c==0)
            {
                res+="1";
                c=0;
            }
            else
            {
                res+="0";
                c=1;
            }
        }

        if(m1.charAt(i)=='0' && m2.charAt(i)=='0')
        {
            if(c==0)
            {
                res+="0";
                c=0;
            }
            else
            {
                res+="1";
                c=0;
            }
        }
        i++;
    }

    return res;
}

提前致谢。

3 个答案:

答案 0 :(得分:1)

您的整个方法只能替换为一行:

public static String addMantissa(String m1, String m2) {
    return new BigInteger(m1, 2).add(new BigInteger(m2, 2)).toString(2);
}

您的问题中提到的28位大小意味着Integer类可能已用于解析,但使用BigInteger意味着任何大小的字符串可以是处理。

您应该使用JDK而不是重新发明轮子。

此外,“代码较少”是一个很好的口头禅(当然代码仍然清晰),而且这段代码密度很高。

答案 1 :(得分:0)

@ShreyosAdikari基本上是正确的。

System.out.print(" " + res.charAt(i));

应该在循环结束时调用,因为res [i]被填充。 也许你的意思是:

System.out.print((" " + res).charAt(i));

但是你不打印最后一个循环的res。

答案 2 :(得分:0)

实际上,异常来自

 while(i < m2.length())

您需要将其更改为

while(i < m2.length() && i<m1.length())

好像m1(比如说1)的长度小于m2(比如说4)而你只检查m2的值。然后在第二次迭代中,它将以2&lt; 4的形式进入循环,当它试图获取m1.carAt(2)(作为长度1)时,它将抛出String index超出边界的异常。