Java 开发中如何正确的踩坑

热点专题 阅读(1058)

作者:mafly

为什么一个好员工是百名普通员工

我们的方法是使用最好的人。我一直认为研发本身就很有创意。如果人们不放松或不够聪明,那么很难做得好。你必须找到最好的人。一个优秀的工程师不是前10名,而是前100名。

因此,在核心工程师中,每个人都要去找血,不想懒得用,只能培养大学生来做。最好的人有很强的动力。你只需要把他放在他喜欢的东西上,让他有一种玩耍的心态。他真的可以做点什么,触摸他给别人留下深刻印象。所以你今天看到我们的许多工程师,他在玩耍时正在创新。

所以,找到最好的人,给他他喜欢和擅长的东西。研发人员不能太严格,一管会“死”。工程师讨厌处理规则和规定。他非常恼火地报道。不要担心他,让用户照顾他。他做了一个产品,用户称赞他。这个上帝是如此强大。他做得不好,用户骂他,他必须自己改变。

谈谈阿里巴巴Java开发手册

我在本手册首次发布之前就已经看过了。当时,我觉得这是每个开发人员都应该阅读的手册。我还写了一篇关于日志规范的文章:

最近,由于总结了我们日常开发中容易忽视的一些问题,它可能是编码常见问题的最低级别,这通常是最容易被忽视的问题。因此,我再次阅读本手册,好像最近已更新到1.2版本。

本手册的目的是让我们尽可能少地踩坑,以防止坑被重复。我将尝试写一些“坑”,看看我们怎么不能踩到坑,以及如何以正确的姿势跳出坑。

随便写NPE

首先声明一个User对象,然后所有代码都可以使用该对象进行演示,这将不在下面描述。很简单,没有代码,上图:

c01989fd21154c21a95efbdbc92407dc

1.自动拆箱抛出NPE

代码只有一行,但很简单:int method(){return new User()。getId(); }

54a55d1130d1443f90064e1d3a931ff5

坑姿势:当包类型为空时,将报?孀远晃臼堇嘈痛砦蟆?

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

2.级联调用很容易产生NPE

这段代码有点令人困惑,因为它执行了collection元素的isEmpty,所以没关系。看一下代码:

c242adc428de42d69abec25804a65a32

没有废话,看结果:

a6b7570c6f794be7af710c7dafe37b6e

没错,它仍然是一个错误。

踩到坑:实际上,即使你判断对象不是空的,你也不能保证对象中的值不为空,这次你在调用级联时会抛出NPE。

手册中NPE的描述:

防止NPE是呼叫者的责任。即使被调用的方法返回一个空集合或一个空对象,调用者也不用担心。必须考虑远程调用失败,序列化失败,运行时异常和其他方案返回null。

即使isEmpty,集合中的元素也可能为null。

级联调用obj.getA()。getB()。getC();一系列调用,易于生成NPE

3.关于等于

这是在日常开发中用于平等比较的最常用方法,因为过去谁不是==。现在我们通常写这个:user.getName()。equals('mafly');

b0ee1eb57d724adfb0bd15cf8c1fa8b9

坑姿势:意外使用空值调用Equals方法。

解决方案:非常简单,写:'mafly'.equals(user.getName());

equals方法倾向于抛出指针异常,应该使用常量或通过确定具有值的对象来调用。

4.地图下的NPE

地图应该是我们开发中最常用的地图。最常见的是HashMap和ConcurrentHashMap。您可能会小心编写此类代码:

a40bc06bcce6482e993623f76d9ebebc

踩到坑:也许我们知道ConcurrentHashMap的K/V不能为空,但有时我们不知道传入的值是否为空。

解决方案:在设置时进行检查,并正确理解并使用其特征。

由于HashMap的干扰,很多人认为ConcurrentHashMap可以放置一个空值,实际上,当存储空值时会抛出一个NPE异常。

Map类集合K/V可以存储空值,如下表所示:

470a5cc26c494f2a93bf667dc0a3dcfe

简单谈谈共同的收藏

5.foreach遍历集合以删除元素

每个人都应该知道,当你遍历集合时使用for循环来进行添加/删除操作时,你会得到一个迭代器。当您使用for循环时,您将收到错误,是否会出错?看一下代码:

e24d6a282cad4a2caa8ce5ba92e12529

我应该报告错误吗?因为在for循环中删除了元素,如果你运行它,你会感到惊讶,输出如下:

e77f49cd8e704087bfd115018877762a

如果你不解释原因,可以阅读这篇文章:

无论它是倒数第二个元素,我们仍然必须小心不要删除或删除foreach循环中的元素。对迭代元素使用Iterator方法(代码秒),并锁定Iterator对象以进行并发操作。

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

应该使用这个工具类,将数组转换为集合非常方便,直接看结果:

b934062460da4424a2fb8ddc98f7ed21

坑姿势:当Arrays.asList()将数组转换为集合时,它不能用于修改与集合相关的方法。它的add/remove/clear方法抛出UnsupportedOperationException。 asList()的返回对象是一个Arrays内部类,没有办法实现集合的修改。

解决方案:在转换之前进行操作。另请注意,在转换然后修改数组的值之后,集合也将更改(注释代码)。

7. toArray()集合转换数组

当我们需要将集合转换为数组时,我们经常调用toArray()方法。如果您使用的是非参数,可以使用吗?

1100cb23616844969b731af5625f865e

当然不是!报告ClassCastException。

踩坑:直接使用toArray()。无参数方法的返回值只能是Object []类。如果强制使用其他类型的数组,则会引发异常。

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

代码如下:

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

Array=list.toArray(array);

8.使用subList

集合中的subList用于返回视图的一部分内容。也许我们不是很常见,但有很多坑,只需直接看代码:

db0aaca6122446df9cba202390588c8c

9cda05ae344147d4ac3c7d7796e67d07

这次我们从输出中查看subList的所有上述代码。

数据。第23-26行:遍历原始集合,甚至大小=2数据和遍历。第40-42行:遍历新集合并抛出ConcurrentModificationException。

From the above code, we should be able to conclude that the new collection returned is supported by the original collection, and the modifications will affect each other. In the subList scene, paying attention to the modification of the number of original collection elements will cause an exception to occur in the traversal, addition, and deletion of the sublist.

Sum up first

I wrote that this is just some pits about the anomaly. There are other surprisingly "My Scorpio" questions. Because the length is too long, I can’t write it anymore. After two days, I will continue. Write it.

Anomalies are really an interesting question.

xx