ArrayList的get方法

funyoo 2018-09-23 02:33:38
传参为负的异常是如何产生的?
源码只判断了index > size

public E get(int index) {
rangeCheck(index);

return elementData(index);
}

private void rangeCheck(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
}

private String outOfBoundsMsg(int index) {
return "Index: "+index+", Size: "+size;
}

@SuppressWarnings("unchecked")
E elementData(int index) {
return (E) elementData[index];
}
...全文
463 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
Surrin1999 2018-09-23
  • 打赏
  • 举报
回复
授人以鱼不如授人以渔 为了把这个问题讲好 我们复现一次这个问题

测试代码

import java.util.ArrayList;

public class TestList {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<>();
list.add(1);
list.add(2);
list.add(3);
list.add(4);

System.out.println(list.get(-1));
}
}


在第11行打一个断点 然后进入debug(调试)模式 然后点击单步跳入(注意不是单步跳过 不知道的话后面的图会有提到)


显然 你也知道rangeCheck只是检测了index > size 那么问题自然出在return这里

继续单步跳入



你会发现 此时忽然进入了一个异常类里面 再结合我的红色箭头 想必你已经猜到一点了

继续单步跳入



很明显了 return时抛出的异常不是ArrayList里调用的 是jvm检测到数组越界而自动抛出的通过跳入到这里我们可以知道 上面那个异常类是继承自RuntimeException 而只有继承自Exception的异常才需要在源码中显式定义 这一张图里的红色箭头指向就是单步跳入 它右边的就是单步跳过

总结 :遇到一些匪夷所思的问题 很多时候我们只要拆分为一小块慢慢剖析,如打断点调试,就能缩小问题的范围,最终找出答案所在 希望能对你有帮助

62,625

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧