网小鱼Java的bug小集锦0014
这个bug是在学习Collection集合当中的ArrayList集合时,在关于remove方法时候,遇到的一个问题,记录一下下~
首先,贴一下报错的源代码:
package day14;import java.util.ArrayList;
import java.util.Collection;public class Test3_Collection {public static void main(String[] args) {// Collection collection = new Collection<>();//Collection是接口不能直接实例化ArrayList<Integer> c = new ArrayList<>();c.add(100);c.add(200);c.add(300);c.add(400);c.add(500);System.out.println(c);// c.clear();清除c中所有元素// System.out.println(c);System.out.println(c.contains(100));System.out.println(c.isEmpty());System.out.println(c.remove(200));System.out.println(c);}
}
在控制台打印的结果如下:
错误提示:IndexOutOfBoundsException
错误原因:在上面代码中想要移去这个"200"这个元素,但是,remove方法是用的下标法来查找内容的,所以数组越界现象发生
再来看另一个测试的小版本:
package day14;import java.util.ArrayList;
import java.util.Collection;public class Test3_Collection {public static void main(String[] args) {// Collection collection = new Collection<>();//Collection是接口不能直接实例化ArrayList<Integer> c = new ArrayList<>();c.add(100);c.add(200);c.add(300);c.add(400);c.add(500);System.out.println(c);// c.clear();清除c中所有元素// System.out.println(c);System.out.println(c.contains(100));System.out.println(c.isEmpty());System.out.println(c.remove("200"));System.out.println(c);}
}
这里面运行结果图片贴一下,如下图:
程序运行到时没有报错,但是显然没有实现想要把“200”这个元素移除的目的,在回到代码中看一下编译器给的提示是什么,为什么会出现这种情况呢?
这里提示写到:‘ArrayList’ may not contain objects of type ‘String’
很明显:我们创建的这个集合是用来装Integer类型的,现在放了一个“String”类型的元素进去,编译器翻译不了这个内容,所以remove这个方法执行的结果就是false,我们再点击进去后面的三个小点点看一下提示:
‘ArrayList’ may not contain objects of type ‘String’
Inspection info: Reports method calls to parameterized collections, where actual argument type does not correspond to the collection’s elements type. For example if you have the following code:
//检查信息:提示下集合的方法调用,其中实际参数类型必须要对应于集合的元素类型。例如,如果你有以下代码:
List list = getListOfElements();
list.remove("");
- the call to remove() will be highlighted. The option ‘Report suspicious but possibly correct method calls’ makes it possible to ignore potentially correct code, like this:
Number number = new Integer(0);
list.remove(number));
根据上面的提示:明确告诉一个信息:remove()的调用将突出显示。“报告可疑但可能正确的方法调用”选项可以忽略可能正确的代码。在调用remove这个方法的时候,执行的操作实际是按照下标来进行操作的,而不是按照这个里面的number俩进行操作的。
根据提示我来修改一下做法:
`package day14;import java.util.ArrayList;
import java.util.Collection;public class Test3_Collection {public static void main(String[] args) {// Collection collection = new Collection<>();//Collection是接口不能直接实例化ArrayList<Integer> c = new ArrayList<>();c.add(100);c.add(200);c.add(300);c.add(400);c.add(500);System.out.println(c);// c.clear();清除c中所有元素// System.out.println(c);System.out.println(c.contains(100));System.out.println(c.isEmpty());System.out.println(c.remove(1));System.out.println(c);}
}
`
运行结果如下图
这里面在remove()方法上面按住ctrl进去看一下它里面的源码的代码是怎么写的:
public boolean remove(Object o) {if (o == null) {//如果要移除的元素为nullfor (int index = 0; index < size; index++)//从0开始循环,每次往后+1,循环到小于目标对象的长度时停止if (elementData[index] == null) {//如果元素中下标==nullfastRemove(index);//快速移除这个元素return true;//返回true}} else {//如果要移除的元素不为nullfor (int index = 0; index < size; index++)//从0开始循环,每次往后+1,循环到小于目标对象的长度时停止if (o.equals(elementData[index])) {//对象等于元素下标值对应的数据fastRemove(index);//快速移除这个元素return true;//返回true}}return false;//如果要移除的元素不为null,且没有找到这个对象等于元素下标值对应的数据}
所以就非常清楚了,源码当中的判断逻辑分了3步走:
- 先判断,要移除的这个元素是不是null,如果是null,按照下标寻找对应元素,并快速移除,返回true;
- 再根据上一步,要移除的这个元素不是null,按照下标寻找对应元素,并快速移除,返回true;
- 再根据上两步,要移除的这个元素不是null,且没有找到这个对象等于元素下标值对应的数据,返回false。
网小鱼Java的bug小集锦0014相关推荐
- 网小鱼Java的bug小集锦0031-Linux环境下安装nginx配置文件错误:端口无法正常映射问题解决
在linux系统下,docker中pull下来nginx之后,因为前一天晚上执行了一下文件,启动nginx容器,运行nginx镜像,执行代码如下: sudo docker run -p 80:80 - ...
- 【面试题】Java常见面试题集锦
Java常见面试题集锦 面试题模块 这份面试题,包含的内容了十九了模块:Java 基础.容器.多线程.反射.对象拷贝.Java Web 模块.异常.网络.设计模式.Spring/Spring MVC. ...
- java与微信小程序通讯_java与微信小程序实现websocket长连接
本文实例为大家分享了java与微信小程序实现websocket长连接的具体代码,供大家参考,具体内容如下 背景: 需要在小程序实现地图固定坐标下实时查看消息 java环境 :tomcat7 jdk1. ...
- 景安服务器可以用小程序吗,微信又放大招,无网环境也能使用小程序!
原标题:微信又放大招,无网环境也能使用小程序! 最近微信小程序的动作不断,就在昨晚又迎来了新能力,也是微信送给开发者的中秋礼物. 这次主要上线4个能力: 小程序"服务商助手" &q ...
- Java实现微信小程序校验图片是否含有违法违规内容
文章目录 1.Java实现微信小程序校验图片是否含有违法违规内容(security.imgSecCheck) 2.接口文档简述 3.Java实现对接接口 4.压缩图片(Thumbnails) 5.整合 ...
- Java 独门绝技 用Java玩谷歌小恐龙游戏 (有源码)
目录 1.Swing成品演示 2.简介 3.Java的Robot类 4.实战开发例子 1.Swing成品演示 2.简介 Java有一个很厉害的类Robot类,这个类可以模仿人的手去操作电脑,鼠标移动, ...
- 用java实现Simsimi小黄鸡接口
package com.iask.webchat.chatmachine; import java.io.BufferedReader; import java.io.InputStream; imp ...
- 计算机毕业设计Java课堂管理系统小程序用户端(源码+mysql数据库+系统+lw文档)
计算机毕业设计Java课堂管理系统小程序用户端(源码+mysql数据库+系统+lw文档) 计算机毕业设计Java课堂管理系统小程序用户端(源码+mysql数据库+系统+lw文档) 本源码技术栈: 项目 ...
- 计算机毕业设计JAVA课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw
计算机毕业设计JAVA课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw 计算机毕业设计JAVA课堂管理系统小程序用户端mybatis+源码+调试部署+系统+数据库+lw 本源 ...
最新文章
- 揭秘百度微服务监控:百度游戏服务监控的演进
- android canvas_Android仿IOS11 控制中心进度条
- tomcat如何增大并发_系统的性能瓶颈,排查该从哪些方面入手,如何定位?
- 括号字符串的有效性和最长有效长度
- html游戏禁止微信浏览器下拉,JavaScript实现禁止微信浏览器下拉回弹效果
- 远程图片保存到服务器 php,保存远程图片到本地服务器几种方法[php,asp]网
- Java8对List<Integer>的求和
- 2019年度最受欢迎中国开源软件评选, 请给JeecgBoot 投票,谢谢支持
- 一个账号,防止多设备登陆
- Android编译期代码生成之apt实践入门
- Meta Learning | 加了元学习之后,少样本学习竟然可以变得这么简单!
- Scala深入浅出实战经典---001-Scala开发环境搭建和HelloWorld解析
- yii2 AR打印sql语句
- 【Anylogic智能体状态转移】
- c语言实验上机报告,c语言上机实验报告_实验报告.doc
- 虚拟服务器 切换任务管理器,在远程桌面连接中使用任务管理器(转)
- 玩转easyARM imax283A开发版(二),移植NES模拟器并增加按键驱动,让板子可以玩超级玛丽游戏
- 大学生了没-20120709迅雷下载
- 2022-JavaScript-过滤数组中的undefined,null,空串,NaN
- liunx 中文乱码 和 html转图片中文乱码问题处理方式以及linux中文字体包
热门文章
- c#打印方框_c#编写一个程序,打印用星号(*)绘制的方框(正方形),每条边5个*...
- PGSQL查询某时间段内的数据、两个时间日期的分钟差、天数
- IT江湖的门派之争——转载
- 视频播放php,HTML 视频(Video)播放
- 一个大专Java程序员的自述
- Openfire实现QQ群功能
- 解决:先安装豌豆荚,卸载之后,在win7的dos下 adb devices 会重启服务,并且不显示设备的问题
- 计算机学院运动会搞笑解说词,趣味运动会搞笑解说词
- Word页面设置点击“确定”后出现卡死情况
- 曾国藩家书之劝学篇 摘录1