当前位置: 首页 > news >正文

网站备案期间如何北京网站建设产品介绍

网站备案期间如何,北京网站建设产品介绍,摄影网页设计方案,怎么给网站做api临近年终,项目交付排期比较紧张,导致很多时候,Code Review 往往是走马观花,没有严格执行。最近,一个实习生就产生了一个十分低级的代码BUG。笔者感觉这个问题,对于实习生,尤其是刚入职的 应届 J…

临近年终,项目交付排期比较紧张,导致很多时候,Code Review 往往是走马观花,没有严格执行。最近,一个实习生就产生了一个十分低级的代码BUG。笔者感觉这个问题,对于实习生,尤其是刚入职的 应届 Java 开发工程师具有一定的普遍性。因此和大家分享一下。

问题背景

项目中有个配置,默认是3个属性值。要求开发先读取这3个配置,然后从数据库中提取所有的数据,如果数据库中的数据和默认配置不同的话,就要增加上。很自然的,我们的实习生执行了下面的判断逻辑。

public static String[] INFO = new String[]{"weibo_name", "weibo_age"};
public static List<WeiInfoBean> getAllWeiboInfo(String str) {List<String> infoList = Arrays.asList(INFO);//...代码逻辑省略infoList.add(((JSONObject) itemJson).getString("item_name"));return list;
}

在UAT环境的时候,因为配置不全,因此 getAllWeiboInfo()函数没有执行。在后续的测试中,也没有细究这方面的代码。但是上线后,系统直接抛出异常:

Exception in thread "main" java.lang.UnsupportedOperationExceptionat java.util.AbstractList.add(AbstractList.java:148)at java.util.AbstractList.add(AbstractList.java:108)at com.weibo.service.impl.WeiboServiceImpl.getAllWeiboInfo(WeiboServiceImpl.java:122)

排查过程

系统报警后,笔者第一时间接手代码,并且迅速定位到了问题的所在:实习的开发同事错误的使用了Arrays.asList()函数,并且进行了增删操作。

在将对应的代码修复后,系统恢复正常。

问题分析

在Java编程中,Arrays.asList方法是一个常见的工具,用于将数组转换为List集合。然而,在使用这个方法的过程中,有时会遇到一些报错,其中一个比较常见的是在尝试向Arrays.asList返回的List中添加元素时抛出UnsupportedOperationException异常。

Arrays.asList方法简介

Arrays.asList是Java中Arrays类提供的一个静态方法,它的主要作用是将数组转换为List。该方法接受一个数组作为参数,并返回一个包装了该数组的固定大小的List。以下是Arrays.asList方法的基本用法:

String[] array = {"A", "B", "C"};
List<String> list = Arrays.asList(array);

在上述示例中,数组array被转换为一个包含相同元素的List集合list

Arrays.asList的限制

尽管Arrays.asList方法提供了方便的数组转换功能,但它有一个重要的限制:返回的List是一个固定大小的List。这意味着,通过Arrays.asList返回的List对象,不能进行结构上的修改操作,例如添加、删除元素等。如果尝试对这个List执行结构上的修改操作,就会触发UnsupportedOperationException异常。

UnsupportedOperationException异常的原因

在运行时,当尝试向由Arrays.asList返回的List添加或删除元素时,会抛出UnsupportedOperationException异常。这是因为Arrays.asList返回的List是一个只读的视图,它直接映射到原始数组,不允许对其进行结构上的修改。

String[] array = {"A", "B", "C"};
List<String> list = Arrays.asList(array);// 尝试添加元素
list.add("D"); // 抛出UnsupportedOperationException异常

在这个例子中,由于Arrays.asList返回的List是不可变的,试图添加元素"D"导致了UnsupportedOperationException异常。

源码分析

我们直接打开JDK源码进行分析

 public static <T> List<T> asList(T... a) {return new ArrayList<>(a);}// ArrayList的构造函数
public ArrayList(E[] array) {this.a = Objects.requireNonNull(array);
}

在构造ArrayList时,传入的数组将直接被引用,而ArrayList的实现并没有提供对数组进行修改的方法。因此,当尝试在返回的List上执行add、remove等修改操作时,就会抛出UnsupportedOperationException异常。

其他使用中的问题

除了增删操作会导致系统报错外,Arrays.asList 方法还有其他使用上的问题,如果不加以注意,就会导致结果和想得到的不同。这里一起提出来,方便大家警醒

不要用基础数据类型转换数组

我们直接使用代码作为说明:

 public static void main(String[] args) {int[] in = new int[]{1,2,3};List list =Arrays.asList(in);System.out.println(list.size());// 结果是1}

上述代码的结果为1,这是为什么呢?我们还是看一下源码:

  @SafeVarargs@SuppressWarnings("varargs")public static <T> List<T> asList(T... a) {return new ArrayList<>(a);}

在源码里,Arrays.asList方法的工作原理是将传入的数组作为参数,创建一个包装该数组的List。但是,由于Java泛型不支持基础数据类型,因此对于基础类型数组,它会将整个数组作为单一元素添加到List中,而不是将数组的每个元素都添加为List的单独元素。

我们需要修改成:

int[] intArray = {1, 2, 3, 4, 5};
List<int[]> intList = Arrays.asList(intArray);

原数组修改,会导致list同步修改

我们直接使用代码作为说明:

public static void main(String[] args) {int[] in = new int[]{1,2,3};List list =Arrays.asList(in);in[0] = 4;System.out.println(list.get(0));// 结果是4}

在使用 Arrays.asList 转换数组为列表时,生成的列表其实是基于原始数组的视图,而不是新的独立副本。这就意味着,如果修改原数组,会影响到由 Arrays.asList 返回的列表,反之亦然。

这种现象的原因在于 Arrays.asList 返回的列表是一个包装了原始数组的固定大小的列表,它直接引用原始数组,而不是复制数组元素到新的列表中。因此,对原数组的修改会在列表中反映出来,反之亦然。

如何优雅使用 Arrays.asList 方法

使用ArrayList构造新的可修改List

String[] array = {"A", "B", "C"};
List<String> list = new ArrayList<>(Arrays.asList(array));
list.add("D"); // 正常执行

通过使用ArrayList的构造函数,将Arrays.asList返回的List转换为一个新的ArrayList,就可以避免UnsupportedOperationException异常,从而可以执行结构上的修改操作。

使用Collections.unmodifiableList方法

String[] array = {"A", "B", "C"};
List<String> list = Collections.unmodifiableList(Arrays.asList(array));// 尝试添加元素
list.add("D"); // 抛出UnsupportedOperationException异常

通过使用Collections.unmodifiableList方法,可以将Arrays.asList返回的List包装为一个不可修改的List,从而禁止对其进行结构上的修改。

总结

Arrays.asList是一个在Java中方便的数组转换工具,是一个经常被开发者使用的方法。但需要注意返回的List是固定大小且不可修改的。在处理需要修改List结构的情况下,使用ArrayList构造新的List或者使用Collections.unmodifiableList进行包装是解决问题的常见方法。通过深入理解Arrays.asList方法的特性,开发者可以更好地利用这个工具,并避免常见的异常情况。通过源码分析,我们更清晰地理解了为什么Arrays.asList返回的List是不可修改的,以及如何避免相关异常。

http://www.yayakq.cn/news/57810/

相关文章:

  • 秦皇岛庆云网站建设陕西建设 节水 官方网站
  • 合肥有多少建网站公司wordpress文章保存目录
  • 正大建设集团股份有限公司网站益阳哪里做网站
  • 深圳平湖做网站罗玉凤做网站
  • 网站备案无前置审批文件乐清做网站哪家好
  • 做ppt的软件怎么下载网站微信运营是做什么的
  • 上海知名建站公司计算机网站开发开题报告范文
  • php做商城网站建设企业购 网站建设
  • 电子元器件采购商城南昌seo锐创
  • php简易企业网站源码网站让百度收录应该怎么做
  • 开展我国电子网站建设造价工程建设协会网站
  • 如何用天地图做网站大连建设网上级部门是沈阳吗
  • 做网站需要买服务器吗个人电子商务网站 制作
  • 温州网站开发建设怎样做网络推广平台
  • 网站公司怎么做推广高德地图是中国的还是国外的
  • 做网站时网页中格式对不齐怎么办php怎么写购物网站商品显示页面
  • 自己如何开网站网站备案查询工信网
  • 杭州企业公司网页设计株洲seo
  • 看企业网站怎么做到百度秒收网站推广工具 刷链接
  • 旅游社做的最好的网站三河网站建设
  • 资料库网站应该怎么做织梦网站模板怎么安装
  • 720全景网站怎么做俱乐部网站 模板
  • 网站怎样优化关键词好如何自建网站视频
  • 网站域名需要购买吗互联网app推广具体怎么做
  • 企业网站资料大全网站布局软件
  • 静安网站建设wordpress如何去掉amp:
  • 谷歌网站开发客户百度快照的作用是什么
  • 网站上的地图导航怎么做唐山网站建设汉狮怎么样
  • 2014年百度seo网站排名的详细优化因素统计网站建设服务费合同
  • 做网站考虑的方面公众号网页制作软件