如何转obj_Java 开发中如何正确的踩坑,看完这个你可以避免50%的错误

为什么说一个好的员工能顶 100 个普通员工

我们的做法是,要用最好的人。我一直都认为研发本身是很有创造性的,如果人不放松,或不够聪明,都很难做得好。你要找到最好的人,一个好的工程师不是顶10个,是顶100个。

所以,在核心工程师上面,大家一定要不惜血本去找,千万不要想偷懒只用培养大学生的方法去做。最好的人本身有很强的驱动力,你只要把他放到他喜欢的事情上,让他自己有玩的心态,他才能真正做出一些事情,打动他自己,才能打动别人。所以你今天看到我们很多的工程师,他自己在边玩边创新。

所以,找最好的人,要给他做他喜欢和擅长的事情。研发人员千万不要去管太严,一管就“死”了。工程师很讨厌跟规章制度打交道,作汇报他都很烦,大家不要管他,让用户去管他。他做好了一个产品,用户表扬他,这个大神多牛逼。他做不好了,用户骂他,他自己赶紧去改。


再谈阿里巴巴 Java 开发手册

之前在这个手册刚发布的时候看过一遍,当时感觉真是每个开发者都应该必读的一本手册,期间还写过一篇关于日志规约的文章:

http://www.cnblogs.com/mafly/p/slf4j.html

最近由于在总结一些我们日常开发中容易忽略的问题,可能是最低级的编码常见问题,往往这也是最最容易忽略的,所以,又重新看了一遍这个手册,好像最近它也更新到了 1.2 版本。

这个手册目的就是让我们尽可能少踩坑,杜绝踩重复的坑。我接下来就打算试着写一些“坑”出来,来看看我们如何一不留神踩坑的,以及如何用正确的姿势跳出坑。


随随便便写出 NPE

首先声明一个 User 对象,接下来所有代码可能都会用到这个对象做演示,在下面将不在赘述。很简单,不上代码,上图片:

5b411b9bd00ed1965429ea8cfac81abe.png

1.自动解箱抛 NPE

代码只有一行,再简单不过了:int method() { return new User().getId(); }

450d439d4deb8f1ac511d81bfa975efc.png

踩坑姿势:包装类型为 null 时,进行自动转换为基本数据类型报错。

解决方案:返回之前进行判断与处理或者改为相同类型。

2.级联调用易产生 NPE

这段代码有点容易迷惑人,因为它进行了集合元素的 isEmpty 判断,按说不会出问题了吧。看代码:

static void method1() { List list = new ArrayList(); list.add(new User()); if (!CollectionUtils.isEmpty(list)) { for (User user : list) { System.out.println("userid:" + user.getId().toString()); } }}

不废话,看运行结果:

713ce869bda3ead877d2632ee4a5e374.png

没错,还是报错了。

踩坑姿势:其实就是尽管你在之前做了对象不为空的判断,但你并不能保证对象中的值不为空,而且这时候去级联调用就会抛 NPE 。

手册中关于 NPE 的描述:

防止 NPE 是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败、序列化失败、运行时异常等场景返回 null 的情况。

集合里的元素即使 isEmpty,取出的数据元素也可能为 null。

级联调用 obj.getA().getB().getC();一连串调用,易产生 NPE

3.关于 Equals

这是日常开发中用于相等比较使用最多的方法了吧,因为当年谁没被 == 坑过阿。现在一般我们都会这么写:user.getName().equals("mafly");

edb8b9511dcaa64d6530fb5cec415f29.png

踩坑姿势:一不小心使用了 null 值调用了 Equals 方法。

解决方案:很简单咯,这么写:"mafly".equals(user.getName());

equals 方法容易抛空指针异常,应使用常量或确定有值的对象来调用 equals。

4.Map 下的 NPE

Map 应该是我们开发中使用最频繁的了,最常用的可能有 HashMap、ConcurrentHashMap 这俩了,可能会一不留神写出这样的代码:

c9b61456cec9ab2363f65aeacb1ddfb1.png

踩坑姿势:可能我们知道 ConcurrentHashMap 的 K/V 都不能为空,但我们有时候并不知道传进来的值是否为空。

解决方案:设置时做下检验,对它的特性正确理解及使用。

由于 HashMap 的干扰,很多人认为 ConcurrentHashMap 是可以置入 null 值,而事实上,存储 null 值时会抛出 NPE 异常。

Map 类集合 K/V 能不能存储 null 值的情况,如下表格:

35e6b2ba469ce2bcb82936647912951a.png

简单聊聊常用的集合

5.foreach 遍历集合删除元素

大家应该都知道,在遍历集合时对元素进行 add/remove 操作要使用 Iterator,使用 for 循环时会报错,一定会报错吗?看代码:

public static void main(String[] args) { List a = new ArrayList<>(); a.add("1"); a.add("2"); a.add("3"); for (String temp : a) { if ("2".equals(temp)) { a.remove(temp); } } Iterator it = a.iterator(); while (it.hasNext()) { String temp = it.next(); if ("2".equals(temp)) { it.remove(); } }}

应该会报错的吧?因为在 for 循环中移出了元素,如果你运行了就会惊讶的,输出如下:

ce248cd793a550d38fa8015d207e02c1.png

不解释其中原因了,感兴趣的可以看这篇文章:

http://blog.csdn.net/bimuyulaila/article/details/52088124

不管是不是倒数第二个元素才没问题,我们依然要注意不要在 foreach 循环里进行元素的 remove/add 操作。remove 元素请使用 Iterator 方式(代码第二种),如果并发操作,需要对 Iterator 对象加锁。

6.Arrays.asList() 数组转换集合

这个工具类应该都用过,可以很方便的把数组转换为集合,直接看结果吧:

625828dfe67a8c2732af8a91cf73a5e8.png

踩坑姿势:Arrays.asList()把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear 方法会抛出 UnsupportedOperationException 异常。asList() 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法。

解决方案:在转换之前操作咯。还需要注意一点,在你转换后,再对数组的值进行修改时,集合也会跟着变哦(注释掉的代码)。

7. toArray() 集合转换数组

当我们需要把一个集合转换为数组时,往往会调用 toArray() 方法,如果你用的是无参的这个可以吗?

ec2aaaedb85c6d6d3df3f3040fa1fb0c.png

当然不可以啦!会报 ClassCastException 异常。

踩坑姿势:直接使用 toArray() 无参方法返回值只能是 Object[]类,若强转其它类型数组将会抛异常。

解决方案:使用 T[] toArray(T[] a); 有参数这个方法

代码如下:

String[] array = new String[list.size()];array = list.toArray(array);

8. subList 的使用

集合中的 subList 是用于来返回某一部分的视图内容的,可能我们不是很常用,但是其中有好多坑的,直接看代码:

9e4bd4b4761e219c3d8ddb5142ddd591.png
03a509e80ad4b8f68e3014c776029127.png

这次我们从输出来看上面的所有关于 subList 的代码。

  • 18行:当你原始集合大小没有那么大时,毫无疑问抛异常。
  • 20-21行:得到一个新的集合,我们往新集合中增加一条数据。
  • 23-26行:遍历原始集合,竟然 size=2 了,而且往新集合中增加的数据存在与原始集合。
  • 28-31行:移除新集合中一条数据,遍历新集合。
  • 33-37行:原始集合增加一条数据并遍历。
  • 40-42行:遍历新集合,抛出 ConcurrentModificationException 异常。

从上述代码中,我们应该可以得出如下结论:返回的新集合是靠原来的集合支持的,修改都会影响到彼此对方。在 subList 场景中,高度注意对原集合元素个数的修改,会导致子列表的遍历、增加、删除均产生异常。

先总结一下

写到这只是其中关于异常部分的一些坑吧,还有另外一些令人异常惊讶的“我的天吶”的问题,由于篇幅太长了点,感觉不能再写下去了,过两天再接着写吧。

异常真的是一个有意思的问题。

作者:maflycnblogs.com/mafly/p/trap.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/523092.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax 在新选卡打开,开始使用 AJAX 控制工具包 (VB) | Microsoft Docs

AJAX 控件工具包入门 (VB)05/12/2009本文内容了解开始使用 AJAX 控制工具包所需的所有知识。AJAX 控制工具包包含 30 多个免费控件&#xff0c;可用于ASP.NET应用程序中。 在本教程中&#xff0c;您将了解如何下载 AJAX 控件工具包&#xff0c;并将工具包控件添加到可视化工作室…

IBM斥资340亿美元完成收购红帽;亚马逊云计算Q2营收数据新鲜出炉;甲骨文推出Oracle专用自治数据库云……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go Waymo应用&#xff08;图片来…

AliOS Things全链路优化-CoAP FOTA

摘要&#xff1a; FOTA&#xff08;Firmware Over-The-Air&#xff09;即空中固件升级功能&#xff1b;CoAP(Constrained Application Protocol),字面意思为受限的应用协议&#xff0c;基于UDP&#xff0c;专为资源有限的物联网设备量身定制&#xff1b;所以AliOS Things的纯Co…

关于IoT网络的一些特征的探讨

摘要&#xff1a; 网络是IoT设备非常关键的部分,本文和大家一起探讨IoT网络的几个重要特征&#xff0c;及AliOS Things尝试提供的一些解决方案。 IoT网络的特征包括IP网络&#xff0c;UDP网络&#xff0c;多种通信手段及拓扑。而AliOS Things也尝试提供包括CoAP&#xff0c;SAL…

字典 学生成绩等级_python-列表及字典进阶

# -*- coding: utf-8 -*-l list(python) print(l) l[2:] zza print(l)numbers [1, 5] print(numbers)numbers[1:1] [2, 3, 4] print(numbers)numbers[1:4] [] print(numbers)d {lilei: 98, hanmeimei: 99} # 写字典的方法 print(d)message [(lilei, 98), (hanmeimei, 9…

highcharts ajax 数据格式,Highcharts ajax获取json对象动态生成报表生成 .

最近做个项目&#xff0c;项目经理想做一个统计报表&#xff0c;在网上查看些资料就选用Highchars 这里和大家分享下使用心得。重点说明此代码是针对一个报表显示多个项对比显示。直接贴代码&#xff1a;web端$(document).ready(function() {var options {chart: {renderTo: c…

5G承载网,到底有哪些关键技术?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 小枣君来源 | 鲜枣课堂之前小枣君给大家介绍了5G承载网的基本知识&#xff08;链接&#xff1a;5G承载网到底有什么不同&#xff1f;&#xff09;。今天&#xff0c;我们再来看看5G承载网中的常见关键技术。首先&#xff0c…

SpringBoot2整合Activiti6工作流框架 源码

git clone gitgithub.com:gb-heima/Activiti.git 创建分支 cd Activiti git checkout -b study6 activiti-6.0.0编译项目 mvn clean test-compilercd modules/activiti-ui//activiti-appmvn clean tomca7:rundemo开始 流程图绘制 首先创建一个基本的maven工程 初步流程图效果…

一个智能运维算法测试方法

摘要&#xff1a; 质量是企业长远生存的根基&#xff0c;是企业竞争的免死金牌。作为质量控制团队的一员&#xff0c;保障和提高所负责系统的质量&#xff0c;是工作的核心。而完善的测试覆盖&#xff0c;是保证质量的有效手段。 写在前面 质量是企业长远生存的根基&#xff0…

阿里巴巴1682亿背后的“企业级”高效持续交付

摘要&#xff1a; 在2017北京云栖大会上&#xff0c;阿里巴巴高级技术专家陈鑫&#xff08;花名神秀&#xff09;&#xff0c;给大家带来了《1682亿背后的企业级高效持续交付》&#xff0c;引起强烈共鸣。神秀从技术负责人关心的研发流程混乱、质量无法保障、环境管理低效、资源…

星形和雪花模型_数据仓库多维数据模型设计

建设数据模型既然是整个数据仓库建设中一个非常重要的关键部分&#xff0c;那么&#xff0c;怎么建设我们的数据仓库模型就是我们需要解决的一个问题。这里我们将要详细介绍如何创建适合自己的数据模型。数据仓库建模方法大千世界&#xff0c;表面看五彩缤纷&#xff0c;实质上…

可视化流程设计器 Activiti Designer

插件安装地址&#xff1a;http://activiti.org/designer/update 插件使用手册&#xff1a;http://www.activiti.org/userguide/index.html#activitiDesigner Intellij IDEA版本: http://plugins.jetbrains.com/plugin/7429?pridea (或在插件中心搜索actiBPM)

FreeWheel是一家怎样的公司?| 人物志

戳蓝字“CSDN云计算”关注我们哦&#xff01;人物志&#xff1a;观云、盘点、对话英雄。以云计算风云人物为核心&#xff0c;聚焦个人成长、技术创新、产业发展&#xff0c;还原真实与鲜活&#xff01;作者 | 孙浩峰在知乎上有一个帖子&#xff0c;题目就是“FreeWheel是一家怎…

2017双11技术揭秘—千亿级流量来袭,如何用硬件加速技术为CPU减负?

摘要&#xff1a; 在刚过去的2017年双11零点流量高峰的考验下&#xff0c;主站接入层Tengine Gzip硬件加速机器运行平稳、同等条件下相比于未开启QAT加速的机器性能提升21%左右。 作者&#xff1a;王发康&#xff08;毅松&#xff09; 主站接入层是阿里2015年全站HTTPS项目诞生…

STS安装 activiti-designer-5.18.0插件

方式一&#xff1a;在有网络的情况下&#xff0c;安装流程设计器步骤如下&#xff1a; 1、点击eclipse上方工具栏的Help&#xff0c;选择Install New Software 2、弹出如下窗口&#xff0c;然后填写插件名称和安装地址 Name: Activiti BPMN 2.0 designer Location: http://a…

2017双11技术揭秘—分布式缓存服务Tair的热点数据散列机制

摘要&#xff1a; Tair是阿里巴巴集团自研的弹性缓存/存储平台&#xff0c;在内部有着大量的部署和使用。Tair的核心组件是一个高性能、可扩展、高可靠的NoSQL存储系统。目前支持MDB、LDB、RDB等存储引擎。本文基于Tair的存储和访问原理&#xff0c;对缓存的读写热点问题进行讨…

5G精华问答 | 5G与LTE有什么关系?

1G时我们用手机打电话&#xff0c;2G时我们能互发短信、看文字信息&#xff0c;3G时上网看图片&#xff0c;而4G时我们看视频和直播&#xff0c;从1G到4G&#xff0c;不仅信号越来越好&#xff0c;安全性越来越高&#xff0c;上网也越来越快了。1Q&#xff1a;5G关键指标A&…

2017双11技术揭秘—双十一海量数据下EagleEye的使命和挑战

摘要&#xff1a; EagleEye作为阿里集团老牌的链路跟踪系统&#xff0c;其自身业务虽不在交易链路上&#xff0c;但却监控着全集团的链路状态&#xff0c;特别是在中间件的远程调用上&#xff0c;覆盖了集团绝大部分的场景&#xff0c;在问题排查和定位上发挥着巨大的作用&…

2017双11技术揭秘—TDDL/DRDS 的类 KV 查询优化实践

摘要&#xff1a; 性能优化是企业级应用永恒的话题&#xff0c;关系型数据库查询优化更是如此。在前台核心业务场景中&#xff0c;类 KeyValue 查询(以下简称类 KV 查询)是非常常见的&#xff0c;并且在应用总 SQL 流量占比很高,如果仅在SQL层面进行进一步优化会非常困难&#…