iis服务器助手广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Java开发人员最常犯的5个错误总结
  • 501
分享到

Java开发人员最常犯的5个错误总结

Java开发人员常犯的错误Java开发常犯错误 2022-12-29 09:12:24 501人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录前言1. 使用Objects.equals比较对象2. 日期格式错误3. 在 ThreadPool 中使用 ThreadLocal4. 使用HashSet去除重复数据5. 线程池

前言

作为一名java开发程序员,不知道大家有没有遇到过一些匪夷所思的bug。这些错误通常需要您几个小时才能解决。当你找到它们的时候,你可能会默默地骂自己是个傻瓜。是的,这些可笑的bug基本上都是你忽略了一些基础知识造成的。其实都是很低级的错误。今天,我总结一些常见的编码错误,然后给出解决方案。希望大家在日常编码中能够避免这样的问题。

1. 使用Objects.equals比较对象

这种方法相信大家并不陌生,甚至很多人都经常使用。是jdk7提供的一种方法,可以快速实现对象的比较,有效避免烦人的空指针检查。但是这种方法很容易用错,例如:

Long longValue = 123L;
System.out.println(longValue==123); //true
System.out.println(Objects.equals(longValue,123)); //false

为什么替换==Objects.equals()会导致不同的结果?这是因为使用==编译器会得到封装类型对应的基本数据类型longValue,然后与这个基本数据类型进行比较,相当于编译器会自动将常量转换为比较基本数据类型, 而不是包装类型。

使用该Objects.equals()方法后,编译器默认常量的基本数据类型为int。下面是源码Objects.equals(),其中a.equals(b)使用的是Long.equals()会判断对象类型,因为编译器已经认为常量是int类型,所以比较结果一定是false

public static boolean equals(Object a, Object b) {
    return (a == b) || (a != null && a.equals(b));
}
    
public boolean equals(Object obj) {
    if (obj instanceof Long) {
        return value == ((Long)obj).longValue();
    }
    return false;
}

知道了原因,解决方法就很简单了。直接声明常量的数据类型,如Objects.equals(longValue,123L)。其实如果逻辑严密,就不会出现上面的问题。我们需要做的是保持良好的编码习惯。

2. 日期格式错误

在我们日常的开发中,经常需要对日期进行格式化,但是很多人使用的格式不对,导致出现意想不到的情况。请看下面的例子。

Instant instant = Instant.parse("2021-12-31T00:00:00.00Z");
DateTimeFORMatter formatter = DateTimeFormatter.ofPattern("YYYY-MM-dd HH:mm:ss")
.withZone(ZoneId.systemDefault());
System.out.println(formatter.format(instant));//2022-12-31 08:00:00

以上用于YYYY-MM-dd格式化, 年从2021 变成了 2022。为什么?这是因为 java 的DateTimeFormatter 模式YYYYyyyy之间存在细微的差异。它们都代表一年,但是yyyy代表日历年,而YYYY代表星期。这是一个细微的差异,仅会导致一年左右的变更问题,因此您的代码本可以一直正常运行,而仅在新的一年中引发问题。12月31日按周计算的年份是2022年,正确的方式应该是使用yyyy-MM-dd格式化日期。

这个bug特别隐蔽。这在平时不会有问题。它只会在新的一年到来时触发。我公司就因为这个bug造成了生产事故。

3. 在 ThreadPool 中使用 ThreadLocal

如果创建一个ThreadLocal 变量,访问该变量的线程将创建一个线程局部变量。合理使用ThreadLocal可以避免线程安全问题。

但是,如果在线程池中使用ThreadLocal ,就要小心了。您的代码可能会产生意想不到的结果。举个很简单的例子,假设我们有一个电商平台,用户购买商品后需要发邮件确认。

private ThreadLocal<User> currentUser = ThreadLocal.withInitial(() -> null);

private ExecutorService executorService = Executors.newFixedThreadPool(4);

public void executor() {
    executorService.submit(()->{
        User user = currentUser.get();
        Integer userId = user.getId();
        sendEmail(userId);
    });
}

如果我们使用ThreadLocal来保存用户信息,这里就会有一个隐藏的bug。因为使用了线程池,线程是可以复用的,所以在使用ThreadLocal获取用户信息的时候,很可能会误获取到别人的信息。您可以使用会话来解决这个问题。

4. 使用HashSet去除重复数据

在编码的时候,我们经常会有去重的需求。一想到去重,很多人首先想到的就是用HashSet去重。但是,不小心使用 HashSet 可能会导致去重失败。

User user1 = new User();
user1.setUsername("test");

User user2 = new User();
user2.setUsername("test");

List<User> users = Arrays.asList(user1, user2);
HashSet<User> sets = new HashSet<>(users);
System.out.println(sets.size());// the size is 2

细心的读者应该已经猜到失败的原因了。HashSet使用hashcode对哈希表进行寻址,使用equals方法判断对象是否相等。如果自定义对象没有重写hashcode方法和equals方法,则默认使用父对象的hashcode方法和equals方法。所以HashSet会认为这是两个不同的对象,所以导致去重失败。

5. 线程池中的异常被吃掉

ExecutorService executorService = Executors.newFixedThreadPool(1);
executorService.submit(()->{
    //do something
    double result = 10/0;
});

上面的代码模拟了一个线程池抛出异常的场景。我们真正的业务代码要处理各种可能出现的情况,所以很有可能因为某些特定的原因而触发RuntimeException 。

但是如果没有特殊处理,这个异常就会被线程池吃掉。这样就会导出出现问题你都不知道,这是很严重的后果。因此,最好在线程池中try catch捕获异常。

到此这篇关于Java开发人员最常犯的5个错误总结的文章就介绍到这了,更多相关Java开发人员常犯的错误内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Java开发人员最常犯的5个错误总结

本文链接: http://www.lsjlt.com/news/176156.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Java开发人员最常犯的5个错误总结
    目录前言1. 使用Objects.equals比较对象2. 日期格式错误3. 在 ThreadPool 中使用 ThreadLocal4. 使用HashSet去除重复数据5. 线程池...
    99+
    2022-12-29
    Java开发人员常犯的错误 Java开发常犯错误
  • 十个开发人员面临的最常见的JavaScript问题总结
    目录问题1:不正确的引用 this问题2:认为存在块级作用域问题3:创建内存泄漏问题4:双等号的困惑问题5:低效的DOM操作问题6:在循环内错误使用函数定义问题7:未能正确利用原型继...
    99+
    2022-11-13
    JavaScript常见问题 JavaScript 问题
  • Java程序员常犯的错误是什么
    这篇文章主要介绍“Java程序员常犯的错误是什么”,在日常操作中,相信很多人在Java程序员常犯的错误是什么问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java程序员常犯的错误是什么”的疑惑有所帮助!接下来...
    99+
    2023-06-16
  • JS使用Promise时常见的5个错误总结
    目录1.避免 Promise 地狱2.在 Promise 中使用 try/catch 块3.在 Promise 块内使用异步函数4.在创建 Promise 后立即...
    99+
    2022-11-13
    JS Promise 错误 JS Promise Promise 错误
  • Python程序员最常犯的十个错误分别是什么
    本篇文章给大家分享的是有关Python程序员最常犯的十个错误分别是什么,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。常见错误1:错误地将表达式作为函数的默认参数在Python中...
    99+
    2023-06-17
  • 如何避免JavaScript 开发者常犯的9 个错误
    如何避免JavaScript 开发者常犯的9 个错误,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。JavaScript 是一种...
    99+
    2024-04-02
  • pandas初学者容易犯的六个错误总结
    目录使用pandas自带的函数读取大文件没有矢量化数据类型,dtypes!不设置样式使用 CSV格式保存文件不看文档!总结我们在这里讨论6个新手容易犯的错误,这些错误与你所使用工具的...
    99+
    2024-04-02
  • 手写TypeScript 时很多人常犯的几个错误
    目录前言1.没有使用严格模式我们为什么要使用严格模式?2. 使用 || 确定默认值那它应该是什么样子的呢?3.使用any作为类型为什么要这么做呢?为什么不能用any?4. val 作...
    99+
    2024-04-02
  • 常见的5个Rails开发误区
    这篇文章主要介绍“常见的5个Rails开发误区”,在日常操作中,相信很多人在常见的5个Rails开发误区问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”常见的5个Rails开发误区”的疑惑有所帮助!接下来,请跟...
    99+
    2023-06-17
  • AngularJS开发者常犯的错误有哪些
    这篇文章主要介绍了AngularJS开发者常犯的错误有哪些,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。介绍AngularJS是如今***的...
    99+
    2024-04-02
  • 总结一些html开发中常见的错误
    很多人都曾经遇到过编写网页时出现HTML代码错误的情况,这种错误如果不及时处理,会导致网页无法正常显示或出现其它问题,给用户带来不良体验。因此,在编写HTML代码时,我们需要注意一些常见的错误,并及时进行修复。首先,常见的HTML代码错误包...
    99+
    2023-05-14
  • 最容易犯的Python开发错误分别是哪些
    这篇文章给大家介绍最容易犯的Python开发错误分别是哪些,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。Python是一门简单易学的编程语言,语法简洁而清晰,并且拥有丰富和强大的类库。与其它大多数程序设计语言使用大括号...
    99+
    2023-06-17
  • java开发管理者们常犯之错误与解决办法
     管理一支软件开发队伍无疑是一项艰巨的任务。而一旦在管理工作中囊括了组织结构职务(包括职业生涯发展与人力资源管理等)乃至团队业绩责任制度,其难度又会更度攀升至新的量级。在这种情况下,管理者需要深刻理解其日常业绩表现,从而评估自身工作成效并推...
    99+
    2023-06-03
  • 开发人员最常用的Linux发行版有哪些
    本篇内容介绍了“开发人员最常用的Linux发行版有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!1. UbuntuUbuntu是一个基于...
    99+
    2023-06-15
  • 十个Golang开发中应该避免的错误总结
    目录不检查错误必要时不使用指针没有正确使用channel不释放资源没有使用正确的数据结构错误地使用循环变量不处理竞赛条件没有使用正确的类型不使用Go的标准库没有有效地使用interf...
    99+
    2023-03-15
    Golang避免的错误 Golang避免错误 Golang 错误
  • 总结5个前端开发中很棒的资源
    以上就是总结5个前端开发中很棒的资源的详细内容,更多请关注编程网其它相关文章!...
    99+
    2023-05-14
    资源 前端
  • ChatGPT 助力开发人员改进代码的5个方式
    ChatGPT可以帮助开发人员改进代码的五种方式包括:1. 语法和格式检查:ChatGPT可以用作代码审查工具,帮助开发人员检查代码...
    99+
    2023-10-11
    ChatGPT
  • Java开发人员的常用类库有哪些
    这篇文章主要介绍“Java开发人员的常用类库有哪些”,在日常操作中,相信很多人在Java开发人员的常用类库有哪些问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java开发人员...
    99+
    2024-04-02
  • CSS网页布局及网站开发常犯的错误有哪些
    本文小编为大家详细介绍“CSS网页布局及网站开发常犯的错误有哪些”,内容详细,步骤清晰,细节处理妥当,希望这篇“CSS网页布局及网站开发常犯的错误有哪些”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,...
    99+
    2024-04-02
  • 2020年面向iOS开发人员的知识点总结(更新中)
    前言:最近在整理自己的技术栈,收集了一些自己认为比较重要的知识点分享给大家。Runloop iOS中触摸事件传递和响应原理 为什么只有主线程的runloop是开启的 为什么只在主线程刷新UI PerformSelector和run...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作