关于数组越界的问题
来源: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行产生的问题:
具体在使用我的参考代码的时候,可以使用替换法尝试定位自己程序的问题。
1)把我的这段remove代码替换到你的程序中,看看是不是就没有问题了?如果没有问题,说明这两段程序有区别:)
2)如果依然有问题,查看一下是不是子过程的问题?比如resize的过程?依然是,可以尝试一下把你的resize替换成我的resize,看是否就没有问题了?如果没有问题,说明你原来的resize有问题:)
3)在一个函数里,几条语句组成的逻辑块,甚至是单一语句,都可以使用这种方法验证:)
另外,debug的过程不能只盯着代码看,必须具体的去调试。加断点,具体地跟一下自己的程序,看看究竟是在运行删除哪个数据的时候,在自己程序的哪里,出了错误?只有经过大量的调试积累,才能练就自己“火眼金睛”的“看”出代码bug在哪里的能力哦:)
加油!
342018-09-29
相似问题