B的方法 方法或其它服务返回的List不是空而是null,没有判空就直接调用List的方法 入参test:由0、1构成,长度为4的字符串,第几位为1就代表第几个参数为null,以此控制wrongMethod...NPE原因 DTO字段null的含义 JSON到DTO的反序列化过程,null的描述有歧义: 客户端不传某个属性或传null,该属性在DTO中都是null。...因为Java中的null就是没有数据,无法区分这两种描述,所以本例中的age属性也被设置为null,可使用Optional解决该问题 POJO中的字段有默认值 如果客户端不传值,就会赋值为默认值,导致创建时间也被更新到...原因是: MySQL中sum函数没统计到任何记录时,会返回null而不是0,可以使用IFNULL函数把null转换为0 MySQL中count字段不统计null值,COUNT(*)才是统计所有记录数量的正确方式...MySQL中使用诸如=、这样的算数比较操作符比较NULL的结果总是NULL,这种比较就显得没有任何意义,需要使用IS NULL、IS NOT NULL或 ISNULL()函数来比较。
但是我的代码并没有对这个方法返回值做任何操作,为何会触发 NPE? 难道是又是自动拆箱导致的 NPE 问题? 在解答这个问题之前,我们首先复习一下条件表达式。 点赞再看,养成习惯。...:,又叫条件表达式,本文不纠结名称,统一使用条件表达式。 条件表达式的基本用法非常简单,它由三个操作数的运算符构成,形式为: ?...: 条件表达式的计算从左往右计算,首先需要计算计算表达式 1 ,其结果类型必须为 Boolean 或 boolean,否则发生编译错误。...当表达式 1 的结果为 true,将会执行表达式 2,否则将会执行表达式 3。 表达式 2 与表达式 3 最后的类型必须得有返回结果,即不能为是 void,若为 void ,编译时将会报错。...用大白话讲,如果表达式 2 与表达式 3 类型相同,那么这个不用任何转换,条件表达式表达式结果当然与表达式 2,3 类型一致。
image.png 阿里妹导读:在三目运算符中,表达式 1 和 2 在涉及算术计算或数据类型转换时,会触发自动拆箱。当其中的操作数为 null 值时,会导致 NPE 。...、: 组合的形式得到一个条件表达式。其中 ? 运算符的含义是:先求表达式 1 的值,如果为真,则执行并返回表达式 2 的结果;如果表达式 1 的值为假,则执行并返回表达式 3 的结果。...原文中的例子相对复杂一些,因为他还涉及到多个 Integer 相乘的结果是 int 的问题,我们举一个相对简单的一点的例子先来重现下这个问题: boolean flag = true; //设置成true...objectBoolean : objectBoolean;//因为x1的类型是对象,所以不需要做任何特殊操作。 //当第二位和第三位表达式都为基本类型时,表达式返回值也为基本类型。...又跟据 JLS 15.25.3 中规定: 如果引用条件表达式出现在赋值上下文或调用上下文中,那么条件表达式就是合成表达式 因为,Boolean b = (map!=null ?
,一不小心就锅从天降; 基于上面这些不太好的体验,让消除的难度增加了不少; 有时候当需求很着急的时候,程序员大部分都会选择以功能为主,一些不太重要的东西总是想着晚点再来补充,先跳过写重要的内容,结果是一跳过就没有然后了...artifactId> 5.7.22 方法列表: 5赋初始值、尽量不要返回null对象 当定于局部变量,定义对象的属性时,能赋初始值的就尽量带上初始值...,当List没有值的时候,可以不返回null对象,而是可以返回一个空的List public List select(){ // 这里处理其他逻辑 // 一旦返回的是null是,返回一个空...null值传到Service甚至保存到数据库,尽早的校验并拦截,就能大大降低出问题的概率 之前介绍的hibernate-validator就能完美解决参数校验问题,详见:SpringBoot!...问题,又不会因此而带来任何的编程负担;简直妙不可言!
说明:POJO类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE问题,或 者入库检查,都由使用者来保证。...【强制】在subList场景中,高度注意对原集合元素的增加或删除,均会导致子列表的遍 历、增加、删除产生ConcurrentModificationException 异常。...【强制】当某一列的值全是NULL时,count(col)的返回结果为0,但sum(col)的返回结果 为NULL,因此使用sum()时需注意NPE问题。...说明:NULL 与任何值的直接比较都为 NULL。 1) NULLNULL 的返回结果是 NULL,而不是 false。 2) NULL=NULL 的返回结果是 NULL,而不是true。...3) NULL1 的返回结果是 NULL,而不是 true。 【强制】代码中写分页查询逻辑时,若 count为0应直接返回,避免执行后面的分页语句。
事故现场 分析定位 解决方案 小结:条件操作符会引发NPE,会降低代码可读性 在Java编程中,三元操作符if-else是一种非常实用的条件操作符,它允许开发者在一行代码中完成条件判断和结果选择。...expression_if_true : expression_if_false; 在这个表达式中,如果condition为true,则表达式的结果为expression_if_true的值;如果condition...陷入困局 遇事不决Debug! 打断点,配置启动参数,启动。 今天偶然发现一个很详细很好用的使用IDEA包含debug的教程,学习入口见文末 这。。。...Java的条件操作符在哪种情况下会执行这个转换,哪种情况下不转呢? 看情况: Java编译器会遵循类型一致性原则,确保三元操作符的两个分支具有相同或兼容的类型。...// 这种情况下条件操作符返回就是Integer类型了 Objects.isNull(userTest) ?
“防御式编程”大家应该不陌生,核心思想是不信任任何“外部”输入 —— 不管是真实的用户输入还是其他模块传入的实参,具体点就是各种判空。...当然聪明的你应该知道,这是一个很弱的限制,调用方没注意或者不理会这个注解的话,程序就依然还有 NPE 导致的 crash 的风险。...Android Studio 的空值检查,在代码提示中 Intent 的 getParcelableExtra 方法返回的是非空,因此这里你直接用方法结果赋值不会有任何警告。...我理解这是 Kotlin 编译工具对 Java 代码检查的不足之处,它无法准确判断 Java 方法是否会返回空就选择无条件信任,即便方法本身可能还声明了 @Nullable。 3....返回指定 return 或函数里最后一行 also 返回该对象本身 takeIf 条件成立返回对象本身,不成立返回 null takeUnless 条件成立返回 null,不成立返回该对象本身 假如用的是
举个例子,我需要在原有逻辑上加一段代码,而新加的代码报错抛出了 NPE,同时又没做异常处理,就直接导致后面的逻辑不运行了,影响了整个原有逻辑,太恐怖了。所以大家一定要小心避开 NPE 这个坑。...对空对象调用静态方法或类方法时,不会报 NPE,因为静态方法不需要实例来调用任何方法; 访问或更改空对象上的任何变量或字段时; 抛出异常时抛出 null; 数组为 null 时,访问数组长度; 数组为...,避免返回 null,而应是空集合或空数组 返回空集合或空数组时,可以保证调用方法(如 size()、 length())不会出现 NPE。...这样的链式调用将不会抛出 NPE。最后返回后,用户只需检查结果是否为 MissingNode 就能判断是不是找到了。...若值存在,不为 null,则 isPresent()方法会返回 true,调用 get()方法可返回该对象。它所起到的作用是避免我们显示的进行空值校验。
说明:BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。...说明:POJO 类属性没有初值是提醒使用者在需要使用时,必须自己显式地进行赋值,任何 NPE 问题,或 者入库检查,都由使用者来保证。...【强制】当 switch 括号内的变量类型为 String 并且此变量为外部参数时,必须先进行 null 判断。 13.【强制】在高并发场景中,避免使用”等于”判断作为中断或退出的条件。...说明:如果并发控制没有处理好,容易产生等值判断被“击穿”的情况,使用大于或小于的区间判断条件 来代替。...【推荐】防止 NPE,是程序员的基本修养,注意 NPE 产生的场景: 1) 返回类型为基本数据类型,return 包装数据类型的对象时,自动拆箱有可能产生 NPE。
1 最常见的异常 NullPointerException (NPE) 是 Java 中最常见的异常。此异常的原因是已知的,但在大多数情况下,开发人员更愿意忽略它并且不采取任何措施。...Optional 本身可能会导致开发人员创建更多的 NPE,例如通过使用 Optional.of(nullable)。 因此,出于上述原因,一些团队更喜欢使用空检查。...因此,每当您返回某些内容时,您必须显式声明返回的结果可以是 Nullable 还是 NotNullable...让我们看下一个示例: 一个可能返回 Null 而不是 String 的简单方法: 现在,...到目前为止,Checker Framework 显示出良好的结果并突出了潜在的 NPE。...Checker Framework 强制我们有一个初始化 id 值的构造函数,例如: 构造函数 因此,Framework 不仅识别了潜在的 NPE,还迫使我们遵循特定的要求或设计。
如果项目组每个人一个月都出现个两三个NPE的话。那么项目组是不是每个月都可以去团建下(自己掏钱海吃海喝,心不心疼)。...业务中返回结果的空值 在我们常见的业务开发中是不是经常会有这样的接口: package com.workit.demo.nullexcption; import com.workit.demo.proxy.User...罚款买过单的人,是会对返回结果进行null的判断。...如果调用者并非谨慎的人或者刚刚入门的人,他就会按照自己的理解去调用接口,拿到结果就不管三七二十一上来对结果就是一顿循环操作,而不进行是否为null的条件判断,如果这样的话,是非常危险的,它很有可能出现空指针异常...使用 Collection 接口任何实现类的 addAll()方法时,都要对输入的集合参数进行NPE 判断。
说明: 本手册明确防止 NPE 是调用者的责任。即使被调用方法返回空集合或者空对象,对调用者来说,也并非高枕无忧,必须考虑到远程调用失败、 序列化失败、 运行时异常等场景返回 null 的情况。...【推荐】 防止 NPE,是程序员的基本修养,注意 NPE 产生的场景: 1)返回类型为基本数据类型, return 包装数据类型的对象时,自动拆箱有可能产生 NPE。...反例: public int f() { return Integer 对象}, 如果为 null,自动解箱抛 NPE。 2) 数据库的查询结果可能为 null。...引起该异常的原因是 JVM 或 ClassLoader 尝试加载某类时在内存中找不到该类的定义,该动作发生在运行期间,即编译时该类存在,但是在运行时却找不到了,可能是变异后被删除了等原因导致; ClassNotFoundException...throw 和 throws 的区别是什么? throw 关键字用来抛出方法或代码块中的异常,受查异常和非受查异常都可以被抛出。 throws 关键字用在方法签名处,用来标识该方法可能抛出的异常列表。
: 我习惯称为三元表达式,需要注意的就是:**一个三元表达式从不会既计算 ,又计算 **。条件运算符是右结合的,也就是说,从右向左分组计算。...问题重现 实际的代码业务逻辑比较复杂,这里我们举一个相对简单的一点的例子先来重现下这个问题: // 设置成true,保证条件表达式的表达式二一定可以执行 boolean flag = true; //定义一个包装类对象类型的...小伙伴们可以把以上的 x3、x4 以及 x6 中的的包装类设置成 null,看看是不是会抛 NPE: boolean flag = true; boolean simpleBoolean = false...nullBoolean : simpleBoolean; 以上三种情况,都会在执行时发生 NPE: 其中 x3 和 x6 是三目运算符运算过程中,根据 JLS 的规则确定类型的过程中要做自动拆箱而导致的...而 x4 是因为三目运算符运算结束后根据规则他得到的是一个对象类型,但是在给变量赋值过程中进行自动拆箱所导致的 NPE。
如果项目组每个人一个月都出现个两三个NPE的话。那么项目组是不是每个月都可以去团建下(自己掏钱海吃海喝,心不心疼)。...业务中返回结果的空值 在我们常见的业务开发中是不是经常会有这样的接口: package com.workit.demo.nullexcption; import com.workit.demo.proxy.User...罚款买过单的人,是会对返回结果进行null的判断。...如果调用者并非谨慎的人或者刚刚入门的人,他就会按照自己的理解去调用接口,拿到结果就不管三七二十一上来对结果就是一顿循环操作,而不进行是否为null的条件判断,如果这样的话,是非常危险的,它很有可能出现空指针异常...使用 Collection 接口任何实现类的 addAll()方法时,都要对输入的集合参数进行NPE 判断。 ? 三目运算符可能产生NPE ?
不管怎么样,null 不是一个有效的对象,所以内存中并没有为它分配空间,没它的位置。null 仅仅是一种表现符号,表明引用此时没有指向任何一个对象。...如果一个变量当前没有确定要初始化的值,那么 null 就是最佳选择,即所谓的延迟初始化,直到实际使用的时候再赋值为“它实际”的值(null 的第 1 个好处)。...不过,NPE 会在运行时被揪出来鞭尸了。 关于 null,还有另外一个有趣的事实:如果使用了带有 null 值的引用类型变量,instanceof 将会返回 false。...instanceof 操作符判断类型的时候没有抛出 ClassCastException,那么结果就为 true。...该方法会一行一行地返回读取的字符串,直到流的结尾。怎么判断到了流的结尾呢,返回 null。这样的话,我们就可以把判 null 作为读取字符串的条件。
一、hibernate的二级缓存 如果开启了二级缓存,hibernate在执行任何一次查询的之后,都会把得到的结果集放到缓存中,缓存结构可以看作是一个hash table,key是数据库记录的...二、hibernate的查询缓存 查询缓存的实现机制与二级缓存基本一致,最大的差异在于放入缓存中的key是查询的语句,value是查询之后得到的结果集的id列表。...假如一个查询条件hql_1,第一次被执行的时候,它会从数据库取得数据,然后把查询条件作为key,把返回数据的所有id列表作为value(请注意仅仅是id)放到查询缓存中,同时整个结果集放到class缓存...也就是说,如果二级缓存配置了超时时间(或者发呆时间),就有可能出现查询缓存命中了,获得了id列表,但是class里面相应的pojo已经因为超时(或发呆)被失效,hibernate就会根据id清单,一个一个的去向数据库查询...该情况将导致性能下降严重。 查询缓存的失效机制也由hibernate控制,数据进入缓存时会有一个timestamp,它和数据表的timestamp对应。
我们看到,客户端 Java 进程花在等待数据库从网络中返回结果的时间占56%。 看到数据库查询是导致应用运行缓慢的原因,其实是好兆头。...如何解析 SQL 日志 对于大量的日志文件,最可行的解析方式就是使用命令行工具,该方法的好处是非常灵活,只要写一小段脚本或命令,我们可以抽取出几乎大多数指标。只要你喜欢,任何命令行工具都适用。...如何你习惯了 Unix 命令行,bash 或是一个好选择。Bash 也可以在 Windows 工作站使用,Cygwin 或 Git 都包含了 bash 命令行。...速成法5——搜索”坏“查询计划 检查最慢查询列表,看看有没有好的查询计划。最常见的”坏“查询计划包括: 全表搜索:通常缺少一个索引或表统计过期时进行全表搜索。...全笛卡尔连接:意思是计算多张表的全笛卡尔乘积。检查一下缺少的连接条件,或拆分为几个步骤以简化查询。 速成法6——检查错误的提交间隔 如果你使用批处理程序,提交间隔会对性能造成十倍甚至百倍的影响。
说明:count(distinct col1, col2) 在处理 NULL 值时,要求所有参与的列都不为 NULL 才能返回有效的结果。...处理 sum() 函数的 NPE 问题 【强制】 当某一列的值全是 NULL 时,count(col) 返回 0,而 sum(col) 返回 NULL。...说明:NULL 与任何值的比较结果都是 NULL。例如,NULL NULL 和 NULL = NULL 的结果都是 NULL,而不是 false 或 true。...选择合适的字段长度和类型对于性能至关重要。 2. 避免在 WHERE 子句中使用函数 【强制】 尽量避免在 WHERE 子句中对列使用函数,这样会导致索引失效,影响查询性能。...尽量将查询条件设置为列的原始值。 3. 合理使用事务 【强制】 在数据操作时使用事务来确保数据一致性和完整性。确保在事务中包含 COMMIT 或 ROLLBACK。
领取专属 10元无门槛券
手把手带您无忧上云