我如何阻止它走出界限,为什么不是我已经在做什么?

时间:2013-12-11 00:10:46

标签: java arrays swap indexoutofboundsexception

string o = "meow"

public static void swapPairs(String o){
    char x;
    char y;
    char[] oc = o.toCharArray();

    //Array goes out of bounds, but it still works. 
    for(int i = 0; i<= oc.length+2;i=i+2){
        x=oc[i];
        oc[i]=oc[i+1];
        oc[i+1]=x;  

        System.out.println(oc[i]+"\n"+oc[i+1]);      
    }
}

这种方法的目标是交换字符串中的每两个字符,我搜索了一下,我无法理解其他解决方案。这个方法适用于单词meow,但它仍然超出界限。为什么呢?
如果谷歌发送给您:我在阵列的末尾添加了两个而不是删除两个。简单的错误总是偷偷摸摸我。

编辑:现在我遇到了不均匀字符串的问题。如果没有匹配,如何告诉编译器留下最后一个字符?

2 个答案:

答案 0 :(得分:4)

oc.length将返回oc数组的长度。

数组是0索引的,这意味着数组中的最后一个元素将是oc.length-1

i<=oc.length+2表示您的循环将继续,直到i超过最后一个索引3。但是,在循环中,你试图访问索引i+1,如果程序允许你,它将一直到最后一个索引之后的 FOURTH 索引。

鉴于您尝试访问oc[i+1],您需要将for循环更改为更像这样:

for(int i=0; i<oc.length-1; i=i+2)

请注意,这是<,而不是<=


要打印它,如果你想要一行,你可以在循环后执行此操作:

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

另一个注意事项,可能有助于您在发布到StackOverflow之前更完整地理解问题,如果您在Eclipse中编写(可能还有一些其他程序),堆栈跟踪会告诉您的不仅仅是OBE。你至少可以阅读它并将发布的代码缩小到发生错误的位置,这很棒,但如果你足够关注,那堆栈跟踪通常会告诉你试图访问的索引的数量,以及它会告诉你数组中最后一个可用索引的编号。

答案 1 :(得分:2)

for循环超出字符串的长度(当ioc.length或更高时)并且您获得ArrayIndexOutOfBounds异常;要解决此问题,您需要限制i,使其始终小于oc.length-1(因为您需要每个字符和连续的字符进行交换)。

您可以这样做:

public class Test
{
    public static void swapPairs(final String o){
        char x;
        char[] oc = o.toCharArray();

        //Array goes out of bounds, but it still works. 
        for(int i = 0; i<oc.length-1;i=i+2){
            x=oc[i];
            oc[i]=oc[i+1];
            oc[i+1]=x;  
        }
        System.out.println(oc);      
    }
    public static void main(final String[] args)
    {
        swapPairs( "meow" );
        swapPairs( "meowe" );
    }
}