当前位置: 首页 > news >正文

java在实际开发中反常识bug

目录

1.背景

2.案例

1.包装类型拆箱导致空指针异常

2.switch传入null,导致空指针异常

3.Arrays.asList添加异常

4.转BigDecimal类型时精度丢失

5.除以0不一定抛异常

6.Steam filter后集合修改,会修改原数据

3.完美&评论


1.背景

这篇博客,将列举本人在实际开发中看到的容易出错,反常识的一些代码写法

2.案例

1.包装类型拆箱导致空指针异常

废话少说,直接上代码

    /*** 测试:包装类型拆箱导致空指针异常* 报错:java.lang.NullPointerException*/@Testpublic void test07() {int productId = getProductType();System.out.println(productId);}public int getProductType() {Integer type = null;return type;}

2.switch传入null,导致空指针异常

 /*** switch传入null* 一开始认为有default就能兼容null的情况了* 但实际会抛出:java.lang.NullPointerException*/@Testpublic void test05() {String a = null;switch (a) {case "1":System.out.println("1");break;default:System.out.println("2");}}

因此建议,Switch传入的参数判定不为空后再使用

3.Arrays.asList添加异常

  /*** 测试:Arrays.asList添加异常* 生产中这种场景的bug很容易出现* 抛出异常:java.lang.UnsupportedOperationException*/@Testpublic void test02() {Integer[] arr = {1, 2};// 只能:定义不可变列表List<Integer> list = Arrays.asList(arr);// 报错list.add(3);}

4.转BigDecimal类型时精度丢失

    /*** 测试:转BigDecimal类型时精度丢失*/@Testpublic void test01() {double n = 2.01d;BigDecimal bigDecimal1 = new BigDecimal(n);System.out.println(bigDecimal1);// 输出:2.0099999999999997868371792719699442386627197265625BigDecimal bigDecimal2 = BigDecimal.valueOf(n);System.out.println(bigDecimal2);// 输出:2.01}

5.除以0不一定抛异常

   /*** 除以0不一定抛异常* 以上代码按常规思路应该是抛出java.lang.ArithmeticException: / by zero才对,但实际输出的却是:Infinity* 只有整数除以0才会抛出异常,浮点数除以0不会抛出异常*/@Testpublic void test03() {double n = 10d;double n2 = n / 0;System.out.println(n2); // Infinitydouble n3 = n2 + 2.3d;System.out.println(n3); // Infinity}

6.Steam filter后集合修改,会修改原数据

 /*** Steam filter后集合修改,会修改原数据* 过滤后的集合中,保存的是对象的引用,当时可能只是想修改过滤后的数据,但实际上,你会把元素数据一同修改了。*/@Testpublic void test05() {// 产品的主要 字段  id,名称,价格List<Product> list = new ArrayList<>();list.add(new Product(1, "苹果", 5));list.add(new Product(2, "车厘子", 50));list.add(new Product(3, "榴莲", 80));System.out.println(list);// 需求:找出价格大于10的产品集合,并设置备注为:高端水果List<Product> filterList = list.stream().filter(v -> v.getPrice() > 10).collect(Collectors.toList());for (Product product : filterList) {product.setRemark("高端水果");}System.out.println("高端水果集合:" + filterList);// 原来的集合也会被修改System.out.println("原来的水果集合" + list);}

上面用到的产品对象,get,set方法略

  class Product {private Integer id;private String name;private Integer price;private String remark;public Product(Integer id, String name, Integer price) {this.id = id;this.name = name;this.price = price;this.remark = remark;}@Overridepublic String toString() {return "Product{" +"id=" + id +", name='" + name + '\'' +", price=" + price +", remark='" + remark + '\'' +'}';}

3.完美&评论

大家在开发中遇到的还有哪些坑,一起评论区分享一下吧!

相关文章:

java在实际开发中反常识bug

目录 1.背景 2.案例 1.包装类型拆箱导致空指针异常 2.switch传入null,导致空指针异常 3.Arrays.asList添加异常 4.转BigDecimal类型时精度丢失 5.除以0不一定抛异常 6.Steam filter后集合修改,会修改原数据 3.完美&评论 1.背景 这篇博客,将列举本人在实际开发中看…...

java多线程(三)重排序与Happens-Before

一、重排序 1.1 指令重排定义和含义 定义&#xff1a;重排序是指编译器和处理器为了提高程序执行效率&#xff0c;在不改变单线程程序执行结果的前提下&#xff0c;对指令执行顺序进行重新排列的一种优化手段。 重排序可以发生在编译器优化阶段&#xff0c;也可以发生在处理…...

RUST知识框架与学习框架

RUST知识框架与学习框架 Rust是一门系统级编程语言&#xff0c;以其内存安全、高性能和并发性而著称&#xff0c;特别适用于开发低级系统、网络服务和并发应用&#xff0c;具有广泛应用前景。 一、Rust知识框架 基础语法与核心概念 变量与类型&#xff1a;包括基本数据类型、…...

git cherry-pick命令使用分享

在日常开发中&#xff0c;有时候会遇到一种情况&#xff0c;线上出了问题&#xff0c;但是现在的预生产环境&#xff08;Pre-production Environment&#xff09;或准生产环境&#xff08;Stage Environment&#xff09;有还未通过验收的内容&#xff0c;那么想进行修复可以选择…...

关闭Chrome快捷键

chrome是没办法改变快捷键以及屏蔽快捷键的&#xff0c;需要安装插件&#xff1a;shortkey 保证插件是开启的 不用做其他设置所有快捷键已被关闭...

常见DDoS攻击之零日漏洞Zero-day Attacks

目录 一、什么是零日漏洞Zero-day Attacks 二、零日漏洞是如何转化为零日攻击的 三、常见的零日攻击类型 四、为什么零日攻击很危险 五、著名的零日攻击事件 六、如何降低零日攻击的风险 七、DDoS攻击防御解决方案&#xff08;定制化&#xff09; 7.1 产品优势 7.2 产品…...

【字符串】Z函数 - 模板

z [ i ] z[i] z[i] 表示字符串 s s s 和 s [ i , n − 1 ] s[i,\ n - 1] s[i, n−1] 的最长前缀的长度&#xff0c;特别的&#xff0c; z [ 0 ] 0 z[0]0 z[0]0 // *********Z函数************** // - 时间复杂度 O(n) vector<int> z_function(string s) {int n (int…...

MySQL范围分区分区表

什么是范围分区分区表&#xff1f; 范围分区是一种根据某个列的范围值来分割表数据的分区方式。在范围分区中&#xff0c;每个分区都有自己的范围条件&#xff0c;当插入数据时&#xff0c;MySQL会根据指定的范围条件将数据分配到相应的分区中。这种分区方式可以使得表的数据按…...

网络UDP报文详细解析

目录 一、简介二、详细介绍三、其他相关链接1、TCP报文段的详细图总结2、TCP三次握手和四次挥手详解3、socket通信原理及相关函数详细总结4、网络包IP首部详细解析 一、简介 本文主要介绍UDP报文格式。 二、详细介绍 UDP是一种无连接、不可靠的用户数据报协议&#xff0c;其…...

望繁信科技入选2024年第3批上海市高新技术成果转化项目名单

近日&#xff0c;上海望繁信科技有限公司&#xff08;以下简称“望繁信科技”&#xff09;凭借其自主研发的“数字北极星流程挖掘分析软件”项目&#xff0c;成功入选2024年第3批上海市高新技术成果转化项目名单。这一殊荣根据《上海市高新技术成果转化项目认定办法》&#xff…...

深入探讨MySQL的锁机制:全局锁、表级锁和行级锁

深入探讨MySQL的锁机制&#xff1a;全局锁、表级锁和行级锁 在数据库管理中&#xff0c;锁机制是确保数据一致性和并发控制的重要手段。MySQL提供了多种锁策略&#xff0c;包括全局锁、表级锁和行级锁。本文将详细探讨这些锁机制的概念、使用场景及其示例代码&#xff0c;帮助…...

iLogtail 开源两周年:感恩遇见,畅想未来

早在上世纪 60 年代&#xff0c;早期的计算机&#xff08;例如 ENIAC 和 IBM 的大型机&#xff09;在操作过程中会输出一些基本的状态信息和错误报告&#xff0c;这些记录通常通过打印机输出到纸带或纸卡上&#xff0c;用于跟踪操作流程和调试&#xff0c;最早期的日志系统借此…...

写给大数据开发:在Databricks中自定义函数

你是否曾经在处理海量数据时感到力不从心?是否在重复编写相似代码时感到厌烦?如果是,那么Databricks中的自定义函数可能就是你一直在寻找的救星。在接下来的5分钟里,让我们一起探索如何利用这个强大的工具来revolutionize你的大数据开发工作流程。 目录 为什么要在Databrick…...

VMware vSphere Client无法访问和连接ESXi虚拟主机解决思路

文章目录 前言1. 问题现象2. 问题原因3. 解决方法4. 参考文章 前言 注意 : 可以先看看参考文章那里&#xff0c;在回过来看 1 、 2 、3 1. 问题现象 版本&#xff1a;VMware vCenter Server 5.5.0 build-2442329 问题描述&#xff1a;用VMware vSphere Client 登录ESXI主机出…...

实现Kruskal算法连通游戏地图地牢

前置知识 c分享&#xff5c;并查集从入门到出门 - 力扣&#xff08;LeetCode&#xff09; 彻底搞懂克鲁斯卡尔&#xff08;Kruskal&#xff09;算法&#xff08;附C代码实现&#xff09; - QuanHa - 博客园 (cnblogs.com) 白色点矩形是地牢&#xff0c;其中白线是按照krsukal…...

turtle画图知识

Turtle库是Python编程语言中的一个库&#xff0c;用于创建各种类型的图形&#xff0c;包括简单圆形、线条、路径和图片。它支持多种图形类型&#xff0c;并且可以绘制出各种复杂的形状。 以下是一些基本的使用方法&#xff1a; 1. 创建一个新的Turtle对象&#xff1a; pytho…...

Elasticsearch简述

Elasticsearch简述 Elasticsearch产品介绍 Elasticsearch是一个基于Apache Lucene的开源的分布式搜索和分析引擎,设计用于云计算中,能够快速处理大量数据。它能够近实时地进行复杂的查询,并且可以用于全文检索、结构化搜索以及分析。Elasticsearch具有以下特性: 分布式搜索…...

SQL— DDL语句学习【后端 9】

SQL— DDL语句学习 在数据管理的广阔领域中&#xff0c;SQL&#xff08;Structured Query Language&#xff09;作为操作关系型数据库的编程语言&#xff0c;扮演着举足轻重的角色。它不仅定义了操作所有关系型数据库的统一标准&#xff0c;还为我们提供了强大的工具来管理、查…...

线程池介绍

1.线程池简介 import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import java.util.concurrent.Future; public class CallableDemo {public sta…...

如何备份电脑所有数据?有哪些方法值得参考借鉴?

备份电脑所有数据是防护数据丢失和泄密的重要一项措施&#xff0c;备份数据也有不同的方式和工具&#xff0c;正确的工具能帮你省时省力&#xff0c;下面盘点了几个方法&#xff0c;来看哪一种最适合你。 一、使用专业备份软件 第三方服务器文件自动备份软件&#xff1a;如安企…...

label-studio的使用教程(导入本地路径)

文章目录 1. 准备环境2. 脚本启动2.1 Windows2.2 Linux 3. 安装label-studio机器学习后端3.1 pip安装(推荐)3.2 GitHub仓库安装 4. 后端配置4.1 yolo环境4.2 引入后端模型4.3 修改脚本4.4 启动后端 5. 标注工程5.1 创建工程5.2 配置图片路径5.3 配置工程类型标签5.4 配置模型5.…...

进程地址空间(比特课总结)

一、进程地址空间 1. 环境变量 1 &#xff09;⽤户级环境变量与系统级环境变量 全局属性&#xff1a;环境变量具有全局属性&#xff0c;会被⼦进程继承。例如当bash启动⼦进程时&#xff0c;环 境变量会⾃动传递给⼦进程。 本地变量限制&#xff1a;本地变量只在当前进程(ba…...

AI Agent与Agentic AI:原理、应用、挑战与未来展望

文章目录 一、引言二、AI Agent与Agentic AI的兴起2.1 技术契机与生态成熟2.2 Agent的定义与特征2.3 Agent的发展历程 三、AI Agent的核心技术栈解密3.1 感知模块代码示例&#xff1a;使用Python和OpenCV进行图像识别 3.2 认知与决策模块代码示例&#xff1a;使用OpenAI GPT-3进…...

解锁数据库简洁之道:FastAPI与SQLModel实战指南

在构建现代Web应用程序时&#xff0c;与数据库的交互无疑是核心环节。虽然传统的数据库操作方式&#xff08;如直接编写SQL语句与psycopg2交互&#xff09;赋予了我们精细的控制权&#xff0c;但在面对日益复杂的业务逻辑和快速迭代的需求时&#xff0c;这种方式的开发效率和可…...

《用户共鸣指数(E)驱动品牌大模型种草:如何抢占大模型搜索结果情感高地》

在注意力分散、内容高度同质化的时代&#xff0c;情感连接已成为品牌破圈的关键通道。我们在服务大量品牌客户的过程中发现&#xff0c;消费者对内容的“有感”程度&#xff0c;正日益成为影响品牌传播效率与转化率的核心变量。在生成式AI驱动的内容生成与推荐环境中&#xff0…...

P3 QT项目----记事本(3.8)

3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...

ServerTrust 并非唯一

NSURLAuthenticationMethodServerTrust 只是 authenticationMethod 的冰山一角 要理解 NSURLAuthenticationMethodServerTrust, 首先要明白它只是 authenticationMethod 的选项之一, 并非唯一 1 先厘清概念 点说明authenticationMethodURLAuthenticationChallenge.protectionS…...

C# 类和继承(抽象类)

抽象类 抽象类是指设计为被继承的类。抽象类只能被用作其他类的基类。 不能创建抽象类的实例。抽象类使用abstract修饰符声明。 抽象类可以包含抽象成员或普通的非抽象成员。抽象类的成员可以是抽象成员和普通带 实现的成员的任意组合。抽象类自己可以派生自另一个抽象类。例…...

SpringCloudGateway 自定义局部过滤器

场景&#xff1a; 将所有请求转化为同一路径请求&#xff08;方便穿网配置&#xff09;在请求头内标识原来路径&#xff0c;然后在将请求分发给不同服务 AllToOneGatewayFilterFactory import lombok.Getter; import lombok.Setter; import lombok.extern.slf4j.Slf4j; impor…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...