Java业务开发常见错误100例

Java业务开发常见错误100例 / 全面避坑 + 最佳实践=健壮代码

朱晔 贝壳金服资深架构师
  • 课程目录
  • 课程介绍
  • 在线阅读:开篇词 | 业务代码真的会有这么多坑?

    我会按照“知识介绍->还原业务场景->错误实现->正确实现->原理分析->小总结 ”来讲解案例,帮你避坑也帮你分析根因。

  • 01 | 使用了并发工具类库,线程安全就高枕无忧了吗?

    我会分享使用并发工具类库容易踩的四类坑,踩坑原因可以归结为:使用并发工具时我们没有充分理解其可能存在的问题、适用场景等。

  • 02 | 代码加锁:不要让“锁”事成为烦心事

    业务代码涉及复杂的锁操作时,强烈建议Mock相关外部接口或数据库操作后对代码压测,以排除锁误用带来的性能问题和死锁问题。

  • 03 | 线程池:业务代码最常用也最容易犯错的组件

    在今天的学习中,我通过三个和线程池相关的生产事故,和你分享了使用线程池的几个最佳实践。

  • 04 | 连接池:别让连接池帮了倒忙

    我以三种最常用的Redis连接池、HTTP连接池、数据库连接池为例,分享了连接池实现方式、使用姿势和参数配置的三大问题。

  • 05 | HTTP调用:你考虑到超时、重试、并发了吗?

    我们一起看看使用Feign和Apache HttpClient进行HTTP接口调用时,可能会遇到的超时、重试和并发的坑。

  • 06 | 20%的业务代码的Spring声明式事务,可能都没处理正确

    今天,我总结了针对业务代码中最常见的使用数据库事务的方式,即Spring声明式事务,与你总结了使用上可能遇到的三类坑。

  • 答疑篇:代码篇思考题集锦(一)

    我们来分析下前6讲的课后思考题,涉及的知识点有并发工具、代码加锁、线程池、连接池、HTTP调用和Spring声明式事务。

  • 07 | 数据库索引:索引并不是万能药

    遇到查询性能问题,就盲目要求给数据表字段创建大量索引,显然是错误的。今天,我们就以MySQL为例来深入理解下索引。

  • 08 | 判等问题:程序里如何确定你就是你?

    我会围绕equals、compareTo和Java的数值缓存、字符串驻留等展开讨论,希望帮你彻底消除代码中的相关Bug。

  • 09 | 数值计算:注意精度、舍入和溢出问题

    对于金融、科学计算等场景,请尽可能使用BigDecimal和BigInteger,避免由精度和溢出问题引发Bug。

  • 10 | 集合类:坑满地的List列表操作

    今天,我会和你分享若干和List列表相关的错误案例。这其中的坑,基本都是由“想当然”踩的。

  • 11 | 空值处理:分不清楚的null和恼人的空指针

    总结来讲,null的正确处理以及避免空指针异常,绝不是判空这么简单,还要根据业务属性从前到后仔细考虑。

  • 12 | 异常处理:别让自己在出问题的时候变为瞎子

    今天,我就来和你说说,为什么使用AOP来进行“统一异常处理”不可取,以及异常处理相关的坑和最佳实践。

  • 答疑篇:代码篇思考题集锦(二)

    今天,我们继续分析第7~12讲的课后思考题,会涉及数据库索引、判等问题、数值计算、集合类、空值处理和异常处理6大知识点。

  • 13 | 日志:日志记录真没你想象的那么简单

    今天,我将从框架使用配置和记录本身两个方面,来说说日志记录的坑和最佳实践。

  • 14 | 文件IO:实现高效正确的文件读写并非易事

    今天,我会从字符编码、缓冲区和文件句柄释放这3个常见问题出发,和你分享如何解决与文件操作相关的性能问题或者Bug。

  • 15 | 序列化:一来一回你还是原来的你吗?

    通常情况下,序列化问题常见的坑会集中在业务场景中,比如Redis、参数和响应序列化反序列化。今天,我们来详细聊聊这些坑。

  • 16 | 用好Java 8的日期时间类,少踩一些“老三样”的坑

    我们一起看看使用遗留的日期时间类,处理日期时间初始化、格式化、解析、计算可能会遇到的问题,以及如何用新日期时间类来解决。

  • 17 | 别以为“自动挡”就不可能出现OOM

    今天,我会从内存分配意识的角度通过一些案例,展示业务代码中可能导致OOM的一些坑。

  • 18 | 当反射、注解和泛型遇到OOP时,会有哪些坑?

    业务项目中大都是增删改查,用到反射、注解和泛型的机会非常少,但只有学好、用好这些高级特性,才能开发出更简洁易读的代码。

  • 19 | Spring框架:IoC和AOP是扩展的核心

    今天,我会通过2个案例分享Spring IoC和AOP的基本概念,以及三个比较容易出错的点。

  • 20 | Spring框架:框架帮我们做了很多工作也带来了复杂度

    今天,我们通过Feign AOP切不到的诡异案例、程序配置的优先级问题这两个案例,感受一下Spring的复杂度。

  • 答疑篇:代码篇思考题集锦(三)

    我们继续分析第13~20讲的课后思考题,这些题目涉及了日志、文件IO、序列化、OOM和Spring框架等知识点。

  • 21 | 代码重复:搞定代码重复的三个绝招

    我从业务代码中最常见的三个需求出发,分享如何使用Java中的一些高级特性、设计模式和工具消除重复代码,才能既优雅又高端。

  • 22 | 接口设计:系统间对话的语言,一定要统一

    今天,我就通过我遇到的实际案例,和你一起看看因为接口设计思路和调用方理解不一致所导致的问题,以及相关的实践经验。

  • 23 | 缓存设计:缓存可以锦上添花也可以落井下石

    使用Redis做缓存虽然简单好用,但使用和设计缓存并不是set一下这么简单,需要注意缓存的同步、雪崩、并发、穿透等问题。

  • 24 | 业务代码写完,就意味着生产就绪了?

    今天,我介绍了使用Spring Boot Actuaor实现生产就绪的几个关键点,包括健康检测、暴露应用信息和指标监控。

  • 25 | 异步处理好用,但非常容易用错

    异步处理虽然好用,但实现时却容易犯三个错:异步处理流程的可靠性问题、消息发送模式的区分问题、大量死信消息堵塞队列的问题。

  • 26 | 数据存储:NoSQL与RDBMS如何取长补短、相辅相成?

    今天,我通过三个案例分别对比了缓存数据库Redis、时间序列数据库InfluxDB、搜索数据库ES和MySQL的性能。

  • 答疑篇:设计篇思考题答案合集

    我们继续分析“设计篇”的思考题。这12道题涉及6大知识点:代码重复、接口设计、缓存设计、生产就绪、异步处理和数据存储。

  • 27 | 数据源头:任何客户端的东西都不可信任

    今天,我就“任何客户端的东西都不可信任”这个结论,通过4个案例和你讲解一些有代表性的错误。

  • 28 | 安全兜底:涉及钱时,必须考虑防刷、限量和防重

    任何涉及钱的代码必须要考虑防刷、限量和防重,今天我们就通过三个案例看看如何在代码层面做好安全兜底。

  • 29 | 数据和代码:数据就是数据,代码就是代码

    今天,我通过案例,和你具体分析了SQL注入和XSS攻击这两类注入类安全问题。

  • 30 | 如何正确保存和传输敏感数据?

    今天,我们从安全角度来聊聊用户名、密码、身份证等敏感信息,在Java业务代码中应该怎么实现保存和传输。

  • 答疑篇:安全篇思考题答案合集

    今天,我们一起分析这门课“安全篇”的课后思考题,这些题目涉及的知识点包括数据源头、安全兜底、数据和代码、敏感数据。

  • 31 | 加餐1:带你吃透课程中Java 8的那些重要知识点(一)

    今天,我会介绍Java 8中最重要的几个功能,包括Lambda表达式、Optional可空对象、并行流操作。

  • 32 | 加餐2:带你吃透课程中Java 8的那些重要知识点(二)

    今天,我用了大量的篇幅和案例,和你展开介绍了Stream中很多具体的流式操作方法。

  • 33 | 加餐3:定位应用问题,排错套路很重要

    今天这一讲,我就与你说说我在应急排错方面积累的心得。这都是我多年担任技术负责人和架构师自己总结出来的,希望对你有所帮助。

  • 34 | 加餐4:分析定位Java问题,一定要用好这些工具(一)

    在今天这篇加餐中,我会带你一起学习如何使用JDK自带工具、Wireshark来分析和定位Java程序的问题。

  • 35 | 加餐5:分析定位Java问题,一定要用好这些工具(二)

    我会介绍如何使用JVM堆转储的工具MAT来分析OOM问题,以及如何使用Arthas来分析、定位高CPU问题。

  • 36 | 加餐6:这15年来,我是如何在工作中学习技术和英语的?

    今天,我会通过自己的经历和你分享一下,如何利用有限的环境、有限的时间来学习技术和英语?

  • 答疑篇:加餐篇思考题答案合集

    今天,我们继续分析“不定期加餐”篇的课后思考题。这些题目涉及了Java 8基础知识、定位和分析应用问题相关的几大知识点。

  • 37 | 加餐7:程序员成长28计

    从毕业后入行到现在作为一个高级管理者,我在互联网领域拼搏15年了。我把自己的成长历程、心得体会整理成了程序员成长28计。

  • 38 | 加餐8:Java程序从虚拟机迁移到Kubernetes的一些坑

    今天这一讲,我们来学习Java应用部署到Kubernetes集群会遇到的4类问题。

  • 结束语 | 写代码时,如何才能尽量避免踩坑?

    学习、分析这些坑点并不是我们的最终目的,在写业务代码时如何尽量避免踩坑才是。今天,我再分享下10条避免踩坑的方法。

  • 结课测试 | 关于Java业务开发的100个常见错误,你都明白其中缘由了吗?

    《Java业务开发常见错误100例》课程结课了,来做一个测试吧!

  • 结课问卷获奖用户名单

    每一个声音都值得倾听,感谢你们,我们一起精益求精!

48讲

你将获得

  • 130 个代码坑点及其解决方案
  • 100 个场景化案例解读
  • 25 次源码深度解析
  • 使用 10 个工具定位问题根因

讲师介绍


课程介绍

有些细节问题,可能只会在某些特定情况下(比如高并发、多线程)出现,一经出现便会成为重大的生产事故;有些细节问题,可能暂时只会影响程序运行的性能,在量变到质变的瞬间爆发;还有些细节问题,比如所谓的服务器不稳定问题,或许运维同学改改配置、时不时重启下系统也能解决,但没从代码层面解决,就意味着程序里始终有一颗定时炸弹。

其实,我们不是不重视这些细节,更不是不想从根儿上解决问题,只是不知道问题到底出在了哪里。而要做好这些细节、避开这些坑,第一步就得知道它们是什么、在哪里、为什么会出现。

因此,我们邀请了朱晔老师,开设了“Java业务开发常见错误100例”这个课程。他从200多个真实的生产事件和事故中,整理提炼了100个Demo(以Java代码演示),涉及130多个坑点、50多条最佳实践,去讲述业务开发中的常见错误。

这些内容不仅可以帮助你写出更好的代码,同时也有助于你进一步补全自己的知识网增加面试的信心。你甚至可以把这些案例当作代码审核的Checklist,帮助别的项目一起避坑,帮助团队一起成长。

在这个课程中,每节课都是Java业务开发的一个核心关注点,每个知识点对应2~5个案例,并按照“知识介绍->还原业务场景->错误实现->正确实现->原理分析->小总结”来讲解每个案例,不仅帮你避开这个知识点的常见坑,更让你能知道产生坑的根本原因,提升自己的技术能力。

在此,也特别感谢王少泽老师,承担了整个课程的技术审核和录音工作。

常见问题

问:非Java开发者是否可以从本课程受益?

答:编程语言是相通的,Java语言的许多坑点,其他语言也有。本课程不会专注于讲解语言本身的坑点,且涉及的案例贴近业务开发的各方各面,更侧重开发方面的误区和最佳实践。因此,即便你的开发语言不是Java,学习这个课程也能有所收获。

问:《Effective Java》《码出高效:Java 开发手册》和本课程的区别是什么?

答:《Effective Java》注重Java语言、《码出高效:Java 开发手册》注重规范,而本课程覆盖使用Java进行业务开发涉及的各种常用框架和技术,不会局限于Java或者JDK本身,且设计篇、安全篇会从更高的视角去看开发时遇到的各种误区。因此,这个课程的讲授思路和内容,和这两本书有较大区别。

课程模块设计

本课程包括三大模块,分别是代码篇、设计篇、安全篇。

  • 代码篇:包含开发层面近20个方面的坑,涉及多线程、数据访问、池技术、日志异常、日期时间、IO和序列化、Spring框架等。这个模块,不仅会分析一些代码的错误写法,还会涉及对基础知识理解不透导致的踩坑。
  • 设计篇:讨论项目技术设计时的一些坑点或误区,涉及接口、缓存、异步、生产就绪、代码重复、数据存储等六个方面的设计。通过场景化的案例、针对可能实际遇到的问题,给出设计思路和最佳实践。
  • 安全篇:介绍后端开发最容易忽略、却又是从开发层面来防控效果最好的四个安全问题。包括客户端数据可信问题、数据和代码的隔离问题、资源防刷兜底问题,以及敏感数据的处理。

课程目录


适合人群

  1. 适宜人群:1~5年经验的Java开发者,尤其是偏业务型项目的开发人员。
  2. 不适宜人群:零编程基础的开发者。

特别放送

免费领取福利


限时活动推荐


订阅须知

随机推荐

屹嘉临YJL-4使用体验怎么样?深度剖析评测功能!

卡诗洗发水点评怎么样?深度爆料评测!

特仑苏牛奶乳品选购技巧有哪些?来看看图文评测!

佳能一次性用品使用感受如何?良心评测点评分享?

光合星球宝宝零食推荐哪种好用?独家评测揭秘内幕!

艾惟诺婴童护肤购买前需要注意什么?体验评测揭秘分析?