当前位置: 首页 > 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.完美&评论

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

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 阿里一款非常不错的多级缓存框架如何使用?
  • Nmap扫描六种端口状态介绍
  • 【java计算机毕设】足浴城消费系统小程序MySQL ssm vue uniapp maven项目设计源代码 编程语言 小组课后作业 寒暑假作业
  • 使用docker compose一键部署 Portainer
  • XSS-过滤特殊符号的正则绕过
  • 从易车“超级818冠军之夜” 看如何借势体育营销点燃汽车消费热潮
  • 框架——Mybatis(!!!MyBatis 环境搭建步骤)
  • Redis远程字典服务器(7)—— set类型详解
  • VAuditDemo常规漏洞
  • DBAPI如何用SQL将多表关联查询出树状结构数据(嵌套JSON格式)
  • 论文解读:LONGWRITER: UNLEASHING 10,000+ WORD GENERATION FROM LONG CONTEXT LLMS
  • 精准掌控,速看顶级软件资产管理方案,让您企业软件资产一目了然!
  • ArcGIS Pro基础:状态栏显示栏的比例尺设置和经纬度位置
  • 微服务:服务的注册与调用和OpenFiegn
  • 未来展望:观测云技术的发展与企业业务的融合
  • Android 控件背景颜色处理
  • EventListener原理
  • GitUp, 你不可错过的秀外慧中的git工具
  • Java IO学习笔记一
  • socket.io+express实现聊天室的思考(三)
  • ubuntu 下nginx安装 并支持https协议
  • 从零开始在ubuntu上搭建node开发环境
  • 基于遗传算法的优化问题求解
  • 精益 React 学习指南 (Lean React)- 1.5 React 与 DOM
  • 跨域
  • 理解在java “”i=i++;”所发生的事情
  • 让你的分享飞起来——极光推出社会化分享组件
  • 通信类
  • 物联网链路协议
  • 一加3T解锁OEM、刷入TWRP、第三方ROM以及ROOT
  • mysql 慢查询分析工具:pt-query-digest 在mac 上的安装使用 ...
  • 好程序员web前端教程分享CSS不同元素margin的计算 ...
  • 数据库巡检项
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​【原创】基于SSM的酒店预约管理系统(酒店管理系统毕业设计)
  • ​iOS安全加固方法及实现
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (2)从源码角度聊聊Jetpack Navigator的工作流程
  • (el-Transfer)操作(不使用 ts):Element-plus 中 Select 组件动态设置 options 值需求的解决过程
  • (LeetCode 49)Anagrams
  • (react踩过的坑)Antd Select(设置了labelInValue)在FormItem中initialValue的问题
  • (阿里巴巴 dubbo,有数据库,可执行 )dubbo zookeeper spring demo
  • (第二周)效能测试
  • (分享)自己整理的一些简单awk实用语句
  • (附源码)ssm码农论坛 毕业设计 231126
  • (转)JVM内存分配 -Xms128m -Xmx512m -XX:PermSize=128m -XX:MaxPermSize=512m
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • .htaccess配置常用技巧
  • .htaccess配置重写url引擎
  • .NET Framework与.NET Framework SDK有什么不同?
  • .NET Micro Framework 4.2 beta 源码探析
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET 中使用 Mutex 进行跨越进程边界的同步
  • .NetCore项目nginx发布
  • .NET开源、简单、实用的数据库文档生成工具