关于数组越界的问题

来源:2-7 动态数组

请叫我deeply

2018-07-10

我的代码:

public E remove(int index){
   if(index<0||index>=size)
       throw new IllegalArgumentException("remove failed.");
   E ret=data[index];
   for(int i=index+1;i<size;i++)
       data[i-1]=data[i];
   size--;
   data[size]=null;
   if(size==data.length/4&&data.length/2!=0);
       resize(data.length/2);
   return ret;
}


老师的代码:

public E remove(int index){
   if(index < 0 || index >= size)
       throw new IllegalArgumentException("Remove failed. Index is illegal.");

   E ret = data[index];
   for(int i = index + 1 ; i < size ; i ++)
       data[i - 1] = data[i];
   size --;
   data[size] = null; // loitering objects != memory leak

   if(size == data.length / 4 && data.length / 2 != 0)
       resize(data.length / 2);
   return ret;
}

一模一样的代码啊,为什么我的运行起来就出现了数组越界!

找了整整一个小时完全没有找到区别,求指导

写回答

1回答

liuyubobobo

2018-07-10

猛地看你的这段代码没有问题。


首先,一般编译器的报错会提示具体在程序的哪一行抛出的异常。比如使用这个课程介绍的IntelliJ IDEA,下面的例子和信息,明确提示了,是在Main.java的第6行产生的问题:

//img.mukewang.com/szimg/5b44d1e300014b3909120456.jpg


具体在使用我的参考代码的时候,可以使用替换法尝试定位自己程序的问题。

1)把我的这段remove代码替换到你的程序中,看看是不是就没有问题了?如果没有问题,说明这两段程序有区别:)

2)如果依然有问题,查看一下是不是子过程的问题?比如resize的过程?依然是,可以尝试一下把你的resize替换成我的resize,看是否就没有问题了?如果没有问题,说明你原来的resize有问题:)

3)在一个函数里,几条语句组成的逻辑块,甚至是单一语句,都可以使用这种方法验证:)


另外,debug的过程不能只盯着代码看,必须具体的去调试。加断点,具体地跟一下自己的程序,看看究竟是在运行删除哪个数据的时候,在自己程序的哪里,出了错误?只有经过大量的调试积累,才能练就自己“火眼金睛”的“看”出代码bug在哪里的能力哦:)


加油!

3
4
liuyubobobo
回复
bradleyu
赞!感谢分享:)
2018-09-29
共4条回复

玩转数据结构

动态数组/栈/队列/链表/BST/堆/线段树/Trie/并查集/AVL/红黑树…

6221 学习 · 1704 问题

查看课程