如何避免Java踩坑教训,教你这三种

血的教训,BigDecimal踩过的坑 所以就不存在精度问题了。当然,这里要特别注意的是,valueOf方法对double类型的值可以保证精度,但是如果传的是float类型,例如0.8f,则依然会有精度问题。使用BigDecimal构造函数和使用valueOf方法初始化,两种方式得到的结果不一样,valueOf方法初始化的BigDecimal数据计算是精确的。由于计算机天生的无法表达完整的二进制浮点数的小数,二进制的小数是无限循环的,所以只能无限接近于精确值,这就造成了浮点计算的精度问题。否则,将返回除法的确切结果,就像对其他操作所做的那样。 阅读详情

 

前言

学习Java很难。经验是最好的老师。经验教你克服错误。我从错误中吸取了教训。你可以从我的错误中吸取教训。 这是我通过艰苦的方式学到的东西,而您不必这样做。

1. Lambdas 可能会给你带来困难

Lambda通常超过 4 行代码。做的比应该做的多。更多的责任——你的工作记忆更难。更多行——多重责任 lambda。

您是否需要更改 lambda 中的变量? 你不能那样做。 为什么?如果 lambda 可以访问调用跨界变量,则可能会出现多线程问题。您不能从 lambda 内部更改调用变量。

lambda 中的快乐路径效果很好。运行时崩溃后,您会收到以下响应:

at [CLASS].lambda$null$2([CLASS].java:85) at [CLASS]$$Lambda$64/730559617.accept(Unknown Source)

Lambda 堆栈跟踪令人痛苦。名称被混淆、难以跟踪且难以调试。

调试 lambda 的更好方法是什么? 使用中间结果。

map(elem -> { int result = elem.getResult(); return result; });

更好的方法是使用高级 IntelliJ 调试技巧。使用TAB来选择要调试的代码。将此与中间结果相结合以获得更好的体验。

“当我们在包含 lambda 的行处停止时,如果我们按 F7(步入),那么 IntelliJ 将突出显示要调试的代码段。我们可以使用 Tab 切换要调试的块,一旦我们决定,然后我们再次单击 F7。”

如何从 lambda 访问调用跨界变量? 您只能访问 final 或有效的 final 变量。您需要包装调用变量。无论是AtomicType或您自己的类型。您可以从 lambda 更改包装的变量。

如何解决堆栈跟踪问题? 使用命名函数。您现在可以找到负责任的代码、审查逻辑并更快地解决问题。使用命名函数来减少神秘的堆栈跟踪。

相同的 lambda 重复? 把它放在一个命名函数中。您将有一个参考点。每个 lambda 都有一个生成的函数,这使得跟踪变得更加困难。

lambda$yourNamedFunction lambda$0

命名函数解决了另一个问题。命名函数会划分大lambdas,创建更小的代码块,并创建可插入的函数。

.map(this::namedFunc1).filter(this::namedFilter1).map(this::namedFunc2)

 

2. 你会遇到列表List问题

您需要使用 Lists。您需要 HashMaps 来获取类似字典的数据。您需要 TreeMap 角色。您不可能不使用集合。

你如何构建一个列表?你需要什么清单?你需要一个不可变或可变的列表吗?答案会影响代码的未来。早点选择正确的清单,否则就会受苦。

Arrays::asList创建“直写”列表。你不能用这个列表做什么?您无法更改已创建列表的大小。大小是不可变的。你可以做什么?设置元素、排序或其他不影响大小的操作。Arrays::asList小心使用,因为它的大小是不可变的,但内容不是。

new ArrayList()创建一个新的“可变”列表。

创建的列表支持哪些操作?这就是要谨慎的原因。

List::of 创建一个“不可变的”集合。大小是不变的,但是内容在某些条件下是不可变的,如果内容是原始值,即 int,则列表是不可变的。看下面的例子。

@Test public void testListOfBuilders() { System.out.println("### TESTING listOF with mutable content ###"); StringBuilder one = new StringBuilder(); one.append("a"); StringBuilder two = new StringBuilder(); two.append("a"); List<StringBuilder> asList = List.of(one, two); asList.get(0).append("123"); System.out.println(asList.get(0).toString()); } 输出: ### TESTING listOF with mutable content ### a123

您需要创建不可变对象并将它们放入List::of才能真正保证不可变, List::of不保证不变性。

3. 注释让你慢下来

你使用注解吗?你了解他们吗?你知道他们做什么吗? 自定义Logged注释 是否适用于每种方法?错误的。我已经使用 ourLogged来记录方法的参数。令我惊讶的是,它不起作用。您盲目地使用自定义注释。

@Transaction @Method("GET") @PathElement("time") @PathElement("date") @Autowired @Secure("ROLE_ADMIN") public void manage(@Qualifier('time')int time) { ... }

这段代码有什么不愉快的地方?有很多配置摘要。你会经常遇到这种情况。配置与常规代码混合在一起。本身还不错,但很难看。

注释是有代价的。读者为阅读付出的代价。我们为了更快的开发而交易冗长。

注释是为了减少样板代码。您不需要为每个端点编写日志逻辑。您不需要配置事务,使用@Transactional. 注释通过提取代码来减少样板。

好的,我们应该回到 XML 吗?不。我正在使用基于 Spring 的应用程序,并且使用 XML 进行配置是轻而易举的。我们确实有注释,但大部分配置都是在XML 中。模式指导配置,学习曲线并不陡峭。注释很方便。注释优势在于方便,XML 优势在于冗长。

这里没有明确的赢家,因为两者都在发挥作用。直到今天,我仍然使用 XML 和注释。当您发现重复的样板文件时,最好将注释背后的逻辑移动。例如,日志记录是一个很好的注释候选者。这个故事的寓意是:不要滥用注释,不要忘记 XML

如何使用Github创建一个完全免费的个人网站 摘要: 本文详细介绍如何利用Github Pages免费搭建个人静态网站,适合零基础用户。首先需注册Github账号并创建特定命名的仓库(格式:用户名.github.io),然后通过网页或命令行创建index.html文件作为网站首页。完成后可通过"仓库设置- Pages"获取网站链接。文章还包含GitHub Desktop的安装使用、代码提交指南及常见问题自检方法,并说明即使Github被墙也可迁移至国内平台(如码云)。整个过程无需编程基础,仅需15分钟即可完成基础网站搭建。 阅读详情

相关推荐

记录:N10激光雷达串口编程,将数据存进 SQLite,并进行 ROS2 - cartographer 单雷达建图

N10 系列采用 TOF(time of flight)测距原理,通过测量调制激光的发射、返回时间差来测量物体与传感器的相对距离。激光发射器发出调制脉冲激光,内部定时器开始 从t1时刻计算时间,当激光照射到目标物体后,部分能量返回,当雷达接收到返回的激光信号时,在t2时刻停止内部定时器计时,光速C,激光雷达到达物体的距离D为:经过N10系列激光雷达内嵌的信号处理单元的实时解算得到探测物体的距离值,结合高精度自适应角度测量模块输出的角度信息,可以得到量程内周围 360 度环境 的二维平面信息。

m0_74013893的博客 1096

Lambda表达式

LAMBDA

ypqdcsdn的博客 312

使用moveit中的报错及解决

1.fatal error: moveit/move_group_interface/move_group.h: 没有那个文件或目录。// #include <moveit/move_group_interface/move_group.h> 改为。问题1 moveit/move_group_interface/move_group.h: 没有那个文件或目录。在运行c++程序时报错。

qq_60566155的博客 2287

Java8 : Lambda

Lambda 使用积累

༺ bestcxx的专栏 ༻ 2708

算法面试八股文『 基础知识篇 』

个人整理的算法面试基础知识八股文,内容较详细。

SG_teresa's blog 4339

VSCode插件全攻略:5分钟搞定Mermaid流程图实时预览(含常见报错解决)

本文提供了一份详细的VSCode插件实战指南,帮助开发者快速配置Mermaid流程图实时预览环境。文章涵盖核心插件选择、高效工作流搭建,并重点解决了图表渲染失败、样式异常等常见报错问题,旨在提升技术文档的编写效率与可视化质量。

rust6ferris的博客 1487

lambda知识点记录

lambda基础

SaKurAhikari的博客 411

Qt代码-软件商店

ui->statusBar->showMessage(QString("%1 已卸载").arg(app["name"].toString()));ui->statusBar->showMessage(QString("开始下载 %1...").arg(app["name"].toString()));QString("%1 已下载完成,是否立即安装?ui->statusBar->showMessage(QString("%1 下载完成").arg(app["name"].toString()));

寒寒豆豆软件公司的博客 112

java lambda表达式详解

java lambda表达式详解 一、为什么要引入lambda表达式? java是一门纯面向对象的语言,如果我们需要传递某个可以复用的代码块,我们必须将代码块逻辑抽离到对象中。比如在调用Arrays.sort实现数组排序时,如果有compare代码块逻辑,我们必须将其抽离到Comparator接口中,并传入Arrays.sort: class MyComparator implements Comparator<Integer>{ public int compare(Integer i1

qq_40751327的博客 4130

TI单芯片毫米波雷达1642代码走读(〇)——总纲

前言 近年来,自动驾驶行业发展如火如荼,雷达技术也逐渐从军工封闭圈走向了开放的市场。 毫米波雷达具有全天候探测能力,特别是在雨雪雾天气以及夜间都能可靠工作,并且探测距离相对其他车载传感器非常远,对运动目标非常敏感,价格还低廉,这些特性都使其成为自动驾驶感知层面不可或缺的一环。 现如今的雷达已经不仅仅局限于测距测速测角等传统的功能,雷达技术正在从感知走向认知、从宽带走向超宽带、从二维走向三维四维、从相控阵走向数字阵列、从单通道走向MIMO、从独立工作走向分布式协同、从分立组件走向射频数字一体化。MIMO

3万+

ABAP 平台 SOAUTH2_CLIENT 全面实战:用一套配置,打通 OAuth 2.0 客户端的创建、联调与运维

本文是一份ABAP平台上配置OAuth 2.0客户端的全流程指南,重点介绍新界面SOAUTH2_CLIENT的使用方法。内容涵盖从概念解析到实操步骤,包括四种常见授权方式的选择、证书信任管理、Scope配置以及联调技巧。指南通过两个企业级案例(对接SAP BTP Cloud Integration和SAML 2.0身份联合)展示实际应用场景,并提供了配置清单和伪代码示例。特别强调新界面将客户端配置、令牌测试和校验功能整合的工程化优势,以及与旧事务码OA2C_CONFIG的主要差异。文中多处引用SAP官方文档

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 319

Lambda 和 SQL 关于对 Null情况的查询

lamebda 查询后必须要select ,不然不出来数据。 数据库查询 Linq 查询 在C#中,存在一种特殊的类型,Nullable的类型,这个类型可以为空的状态。 在数据库中,如果类型允许为空,就会有NULL的字段 在Lamda查询表达式中,对于数据库中为空的情况也要特殊的注意一下 在SQL的查询中,如果存在为空的字段,例如 ----------------

Jacky的专栏 5869

YOLO26涨点改进 | 小目标损失函数独家改进篇 | TGRS 2025 | 引入AdaFocalLoss损失函数,改进小目标检测,自适应聚焦小目标与样本分布不平衡,提升检测精度与训练稳定性

本文提出将AdaFocalLoss损失函数应用于YOLO26模型优化,有效提升小目标检测性能。AdaFocalLoss通过目标尺寸感知机制和IoU引导的动态调节,自动调整训练权重和聚焦程度,解决了样本不平衡问题。相比传统损失函数,它无需手动调参,能增强训练稳定性,在多尺度、复杂场景下表现优异。文章详细介绍了AdaFocalLoss的原理、优势及实现方法,并提供了代码集成指南。实验表明该方法能显著提升检测精度和鲁棒性,特别适用于小目标检测任务。

Ai缝合怪、助力小伙伴高效发论文 337

appium详细总结,书写万字教你避开环境配置坑,看看你是否有未踩过的坑_更换局域网后appium

上面两篇呢用于初步的学习,学习完上面两篇,就可以慢慢的深入学习了。注:appium啥也不多就是测试工具多!慢慢看,慢慢学,除了这些还有呢!

m0_61549953的博客 866

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

7 年 Java 后端,面试过程踩过的坑,我就不藏着了

有些工作,肯定会 996, 也有大小周,当然,活少钱多的也轮不到咱;注意手机号是否设置了拦截,有一些大厂是通过网络号拨进来的,不要被识别拦截,如果是心仪公司,就得不偿失了。有可能同一家公司,会有不同的部门在招聘,如果很想去这家公司,不在乎岗位,可以选择难度低一些的进行选择。面试是一个马拉松,别一下子冲太急,不然后劲会不足,到最后就会很累,甚至最后妥协选择一家不太想去的。如果每天接受的面试场次很多,对自己也是一场考验,每天参加两场就已经很好了。当你投递出去的简历,没有筛选通过,就要考虑是不是简历出了问题。

uzong 667

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

开发MCP Server踩了无数坑?这4个血泪教训让你少走弯路

本文总结了开发MCP Server的四大核心教训:1)采用小步快跑策略,从最小可行版本逐步迭代;2)明确安全责任分层,服务端专注功能实现,客户端负责权限控制;3)通过模块化设计避免代码混杂,保持结构清晰;4)重视监控与日志,确保系统可观测性。每个教训均配有实际案例及解决方案,强调从简单功能验证开始、合理划分职责边界、降低代码耦合度以及建立完善监控机制的重要性,为开发者提供了实用的设计原则和实践指导。

分享平时的学习心得和笔记 1201

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

Java并发编程踩坑记,10个血的教训

之前以为`volatile`能解决所有线程安全问题,后来发现它只能**保证可见性,但不能保证原子性**,比如`i++`操作,`volatile int i`仍然可能被多个线程同时修改导致结果错误。**教训**:应该用`wait()`和`notify()`(或`Condition.await()`/`signal()`),让线程在等待时释放锁,提高效率。**教训**:`volatile`适合单写多读场景,复合操作(如`i++`)需要用`synchronized`或`AtomicInteger`。

2509_93945572的博客 300

踩了定时线程池的坑,导致公司损失几千万,血的教训

大家好呀,上周我们公司由于定时线程池使用不当出了一个故障,几千万的单子可能没了。给兄弟们分享分享这个坑,希望兄弟们以后别踩!业务中大量的使用定时线程池(ScheduledExecutorService)执行任务,有时候会忽略掉 Try/Catch 的异常判断。当任务执行报错时,会导致整个定时线程池挂掉,影响业务的正常需求。

爱敲代码的小黄 2976

java 输出 双引号_Java开发最容易踩的十个大坑,每条都是血的教训!

本文为Java程序员们准备了一系列广为流传的Java最佳编程实践,请认真读几遍(尤其是小白)。认真看完后,必有收获,日后开发可以少踩坑!1.优先返回空对象而非null如果程序要返回一个对象,确保返回的对象有值而不是null。这能节省大量的"if else"检查。2.谨慎操作字符串如果两个字符串在for循环中使用+操作符进行拼接,那么每次循环都会产生一个新的字符串对象。这不仅浪费内存空间同时还会影响...

weixin_34345695的博客 422

Java开发最容易踩的十个大坑,每条都是教训

本文为Java程序员们准备了一系列广为流传的Java最佳编程实践,请认真读几遍(尤其是小白)。 认真看完后,必有收获,日后开发可以少踩坑! 文末干货:Java业务开发常见错误100例 1.优先返回空对象而非null 如果程序要返回一个对象,确保返回的对象有值而不是null。这能节省大量的"if else"检查。 public String getLocationName { return (null == cityName ? "": cityName);} 2.谨慎操作字符串 如果两

xiaodi824的博客 977

Java 中 null 值在 JSON 输出时丢失的坑:一次 Object 参数 + Fastjson 多态的血泪教训

这个问题的根因,其实一句话就能说清:

G探险者的博客 840

appium详细总结,书写万字教你避开环境配置坑,看看你是否有未踩过的坑_appium label和name

APP测试工具是有点多,这些也不是全部,项目也不会全部用,择一欢喜,也莫偏心,技多不压身。在这呢,望君少踩坑,入坑多来逛逛,自然就出坑了。网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。需要这份系统化学习资料的朋友,可以戳这里无偿获取一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

2401_84586689的博客 1044

InfiniteYuan 优快云博客目录:Java后端开发与踩坑实战导航

技术知识积累到一定规模后,如何让沉淀的内容被高效复用,成为开发者普遍面临的挑战。系统化的内容组织与导航设计,本质上是将零散经验按照认知逻辑和学习路径重新编排,从而降低信息检索成本。一份结构清晰的技术目录,不仅承载着知识管理的作用,更能帮助读者快速定位所需主题,沿着从基础原理到实战应用的路径稳步提升。围绕Java后端开发、并发编程、JVM调优、框架中间件、踩坑实录等高频场景,优质博客通过分类索引和阅读引导,将源码分析、工程实践与问题排查经验串联成完整的知识链路。无论初学者梳理学习路线,还是资深工程师检索线上问

weixin_33859844的博客 378

appium详细总结,书写万字教你避开环境配置坑,看看你是否有未踩过的坑

环境搭建篇=====首先我们来看看环境搭建篇,在进入学习之前,环境搭建我们必不可少,但是最容易出问题的地方也还是环境搭建,很多人初次学习python的朋友,python环境就没搭建对。除了python环境,还需要Android SDK、JDK,初次跑自动化这是必备的。既然是必备的,很多朋友就被卡在这了。python坑首先打开右击我的电脑选择属性:再点击高级系统设置,选择环境变量:你以为我是在教你配环境?错,是告诉你别踩坑这里有两个path,你是否配在的上面的path。

zxfbhxgnc的博客 985

别让密码变成“明文快递“:Java中彻底避免密码泄漏的血泪教训

定时攻击(Timing Attack)利用程序运行时间的差异来推测密码。例如,如果比快,攻击者就能推测出密码的前几位。

墨夶的博客 959
上一篇: 分享一下基础的 netty 使用,实现后台往前端推送信息
下一篇: 强大的Spring Native,启动一个 SpringBoot 项目只需0.07 秒
Java_LingFeng
博客等级 码龄4年 505粉丝 259原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值