java - 我如何阻止它超出范围,为什么我已经在做的事情不起作用?

标签 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”这个词,但仍然会出界。为什么?
如果 Google 将您发送到此处:我在数组末尾添加了两个,而不是删除了两个。简单的错误总是偷偷地发生在我身上。

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

最佳答案

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

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

i<=oc.length+2意味着你的循环将继续直到 i比最后一个索引晚了 3。而且,在循环中,您尝试访问索引 i+1如果程序允许,将一直到最后一个索引之后的第四索引。

鉴于您正在尝试访问oc[i+1] ,您需要更改您的for循环看起来更像这样:

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

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

<小时/>

要打印它,如果您希望将其全部放在一行上,您可以在循环之后执行此操作:

System.out.println(new String(oc));
<小时/>

另一个注意事项,这可能有助于您在发布到 StackOverflow 之前更全面地理解问题,如果您在 Eclipse(也许还有其他一些程序)中编写,堆栈跟踪会告诉您的不仅仅是 OBE。很高兴您至少阅读了该内容,并且可以将发布的代码缩小到错误发生的确切位置,但是如果您足够仔细,该堆栈跟踪通常会告诉您尝试访问的索引号,并且它会告诉您数组中最后一个可用索引的编号。

关于java - 我如何阻止它超出范围,为什么我已经在做的事情不起作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20508017/

相关文章:

java - 将字符串日期转换为长值并执行计算的问题

php - MySQL 子组?

python-3.x - 如何在 Python 中重新排列字节数组中的字节?

javascript - JavaScript 中的图像交换?

java - 实现 HTTP 代理以克服跨站点 AJAX 请求限制(?)

java - onResume 调用了 "dead" fragment - 如何正确恢复?

java - 如何在mongo查询java驱动程序中执行$or和 "and"?

arrays - 根据 NSPredicate SWIFT 过滤结构数组

java - 从数组中删除重复字符

java - 使用引用调用交换两个数字