首页
学习
活动
专区
圈层
工具
发布

如何避免 Java 中的“NullPointerException”

而且,即使我们忘记使用 Optional 功能,这个想法也会突出显示 .get() ,提醒我们为设计提供空检查。 9 Optional 为什么不那么受欢迎?...该框架可以通过强制开发人员指定 Nullability 来找到潜在的空值。...让我们使用 Null 检查和可选的 ifPresent 来修复它: 使用 Null 检查和可选的 ifPresent 修复问题 而且,编译后,我们得到了一个成功的构建: 构建成功 15 检查器框架限制...不幸的是,我还没有找到在 maven 编译步骤中添加它的方法。因此,如果存在,请在评论中告诉我,我会对其进行测试并将其添加到文章中。...如果我必须实现自己的解决方案并且它必须在生产中保持稳定,即使我必须摆脱 Lombok 甚至 Builder Pattern,我也会使用 Checker Framework。

3.7K20

「技能分享」有效处理空值的10个技巧,学不会算我输

我在某些代码库中看到的一种非常糟糕的做法是在简单的空检查就足够了的地方使用Objects方法,Optional类,甚至使用Optional的单独方法。...类字段是一种诱人的案例,它不是为设计而设计的,而且肯定不是必需的。通过封装,您应该完全控制字段的值,包括null。...另一方面,将字段设置为显式可选可能会给您带来奇怪的问题,例如: 您应该如何为此类字段编写构造函数或设置方法? 即使在确定值存在的情况下,您也必须处理Optional。 自动映射器应如何处理这些字段?...因此,对字段使用直接引用,并仔细分析字段在任何给定点是否可以为空。如果您的班级得到了很好的封装,那么这应该很容易。 8.对空使用异常 您可能会看到人们使用null的一种奇怪情况是例外情况。...这是一种固有的容易出错的做法,因为关键错误可以在系统的不同位置被忽略或重新出现,从而使调试变得很痛苦。因此,如果出现问题,请始终抛出异常,而不是返回null。

1.8K30
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    为什么要用Getter和Setter方法,而不是公开属性

    当我在Java语言编程中开始我的职业生涯时,我就对Getter和Setter感到困惑。为什么要这么写呢?为什么不直接用Public呢?这对我来说是个奇怪的语法。 ?...例如,可以将字段设置为空值,如果在另一个方法中使用该字段,则该方法可能会因空指针异常而崩溃。 但是,如果你提供了一个Getter和Setter,你可以在完全控制的同时提供间接访问。...对象决定是否设置调用者值。这同样适用于Getter方法——您可以决定返回实际的引用或克隆它,并将其返回给调用者。 因此,Getter和Setter起到保险丝或断路器的作用,电流必须通过保险丝。...如果发生故障,熔断器与主电路分离,电路是安全的。这里的概念是相同的。如果出现任何错误,Setter将不会将该值传递给类成员字段。读了解释之后,我知道你还有一个问题。...但是,当一个字段没有这样的验证约束时,为什么要麻烦写一个Getter和Setter?我可以简单地公开它。 根据我的理解,问题的症结在于避免使代码变得不必要的复杂。

    2.4K10

    安全的数据库图形管理工具(4):SQL语句(2)

    其实不是,是-128~127(-2(1*8-1) ~ 2(1*8-1)-1)之间,为什么是这样,我们先看一下0这个数,如果真的是-127~127,那么+0和-0都是一个数值,一个数值有两种形式的表示不是太好...,因为我完全可以把其中一个0的表示放到边界,让它可以多表示一个数,这里它放到了负数的边界,为什么是负数的边界?...这些数据虽然最小值都不是从0开始,但它们都有一个零值表示,这种情况一般出现在插入数据的时候,比如秒的最大范围是59,少数情况下是60(因为闰秒),但是我在插入的时候,把秒的值写成了70,就直接表示成为0000...非空约束 非空约束就是确保拥有非空约束的字段不是空,也很简单。 主键约束 拥有主键约束的字段不能为空也不能重复,这么说,主键约束就是唯一约束+非空约束吗?...实际上每个表都有主键约束,即使在不设置主键约束的情况下。如果没有设置主键约束,它默认就是把全部字段作为一个联合主键,这样可以确保数据唯一。

    85920

    深入剖析:认识Oracle 中的 NULL 值

    有些人可能会说,既然’’就是 NULL,为什么不能进行 IS ’’的判断呢: 其实从上面的错误信息就可以看到答案。...那么为什么要说’’是 NULL 的字符表示形式呢:因为’’和 NULL 还确实不完全一样,对于 NULL 来说,它表示了各种数据类型的 NULL 值。...而且,对于 NULL 的加、减、乘、除等操作的结果都是 NULL,而为什么字符串合并操作||,当输入字符串有一个为空时,不会得到结果 NULL。 上面两个问题需要从 NULL 的存储格式上解释。...C 语言中的空字符串””对应 Oracle 中 ASCII 表中的0值,即 CHR(0)。 但 CHR(0)是一个确定的值,它显然不是 NULL。...但是对于复合索引,由于存在着多个列,如果某一个索引列不为空,那么索引就会包含这条记录,即使索引中其他所有的列都是 NULL 值。

    3.1K51

    MySQL战记:Count( *)实现之谜与计数策略的选择

    而 InnoDB 引擎就麻烦了,它执行 count(*) 的时候,需要把数据一行一行地从引擎里面读出来,然后累积计数。为什么 InnoDB 不跟 MyISAM 一样,也把数字存起来呢?...count(*) 肯定不是 null,直接按行累加。主键 ID肯定非空,为什么优化器不能像优化 count()那样优化count(主键ID) 呢?答案是没必要,不做重复优化,推荐使用 count()。...Redis 的数据不能永久地留在内存里,所以你会找一个地方把这个值定期地持久化存储起来。但即使这样,仍然可能丢失更新。...异常重启毕竟不是经常出现的情况,这一次全表扫描的成本,还是可以接受的。但实际上,将计数保存在缓存系统中的方式,还不只是丢失更新的问题。即使 Redis 正常工作,这个值还是逻辑上不精确的。...现在,我来简洁地解释一下为什么将计数值存储在Redis中不能保证与MySQL表中的数据精确一致。Redis和MySQL是不同的存储系统,它们不支持分布式事务,因此无法提供精确一致的视图。

    30610

    Go 复合数据类型之结构体与自定义类型

    所以对于像 Book 这样的结构体类型,使用零值初始化并不是正确的选择。 那么采用零值初始化的零值结构体变量就真的没有任何价值了吗?恰恰相反。...如果一种类型采用零值初始化得到的零值变量,是有意义的,而且是直接可用的,这种类型为“零值可用”类型。可以说,定义零值可用类型是简化代码、改善开发者使用体验的一种重要的手段。...这会导致编译错误,因为未导出字段是不可见的。 那么,如果一个结构体类型中包含未导出字段,并且这个字段的零值还不可用时,我们要如何初始化这个结构体类型的变量呢?...这些基本数据类型的对齐要求很好理解,那么像结构体类型这样的复合数据类型,内存对齐又是怎么要求的呢?是不是它的内存地址也必须是它类型大小的整数倍呢? 实际上没有这么严格。...在早期的一些处理器中,比如 Sun 公司的 Sparc 处理器仅支持内存对齐的地址,如果它遇到没有对齐的内存地址,会引发段错误,导致程序崩溃。

    32320

    Go 复合数据类型之结构体与自定义类型

    所以对于像 Book 这样的结构体类型,使用零值初始化并不是正确的选择。 那么采用零值初始化的零值结构体变量就真的没有任何价值了吗?恰恰相反。...如果一种类型采用零值初始化得到的零值变量,是有意义的,而且是直接可用的,这种类型为“零值可用”类型。可以说,定义零值可用类型是简化代码、改善开发者使用体验的一种重要的手段。...这会导致编译错误,因为未导出字段是不可见的。 那么,如果一个结构体类型中包含未导出字段,并且这个字段的零值还不可用时,我们要如何初始化这个结构体类型的变量呢?...这些基本数据类型的对齐要求很好理解,那么像结构体类型这样的复合数据类型,内存对齐又是怎么要求的呢?是不是它的内存地址也必须是它类型大小的整数倍呢? 实际上没有这么严格。...在早期的一些处理器中,比如 Sun 公司的 Sparc 处理器仅支持内存对齐的地址,如果它遇到没有对齐的内存地址,会引发段错误,导致程序崩溃。

    27820

    102-not in和not exists到底选哪个?这个问题有点复杂,但是结论很简单,不要被专家们带偏了。

    我本人是非常赞同上面的说法,但是在对上面这些理论的解读上,网上还有其他一些专家说法, 我认为不是太恰当,为了避免这些文章误导广大读者,下面列举几个网上我认为不太准确的观点: 1.not in 和 not...证明(反证法)正式开始: 先创建演示使用的表和索引(oracle 11g+的环境): 创建两张表T1和T2: 表上没有not null约束,用来做关联的object_id字段也不存在空值记录: create...: “not in 和 not exists的性能没差别,无论列是否为空” 虽然下面两个查询返回的结果集相同,但是二者在逻辑上本来不等价(一旦主查询或子查询的关联字段上有null值,结果集就不同了),...因为原培训材料就是在不考虑列是否为空的情况下做的比较,我就顺着这个思路给出了下面not exists比not in效率高的反例: not in写法,使用Hash join的执行计划,有索引也用不上(即使用...这也是为什么not exists被推荐使用的原因之二。

    75240

    性能大PK count(*)、count(1)和count(列)

    那么是不是这个rows值就能代替count(*)了吗? 其实不能,rows这个是从从采样估算得来的,因此它也是不是准确。...count(1) 会统计表中的所有的记录数,包含字段为 null 的记录。 同样遍历整张表,但不取值,server 层对返回的每一行,放一个数字1进去,判断是不可能为空的,按行累加。...null,还要把值取出来再判断一下,不是 null 才累加。...count(*) 需要注意的是,并不是带了 * 就把所有值取出来,而是 MySQL 做了专门的优化,count(*) 肯定不是null,按行累加。...(列名)只包括列名那一列,在统计结果的时候,会忽略列值为空(这里的空不是只空字符串或者0,而是表示null 的计数,即某个字段值为null 时,不统计。

    1.8K10

    Go 100 mistakes之常见的JSON错误

    不幸的的,上面的输出是空: {} 为什么输出会是空呢?是因为我们忘记在结构体中设置JSON标签了吗?在Go中,结构体的标签是出现在字段类型定义后面的标记符。...实际上,对于marshal/unmarshal JSON数据的时候设置JSON标签不是必须的。默认情况下,JSON字段的名称会和结构体字段的名称相同。 那是因为该类型没有被导出吗?...这就是为什么嵌入式字段主要用于结构体或接口中,而不是像int或string之类的基本类型。 使用JSON的marshaling方法封装嵌入字段会有什么影响呢?...对于ID字段和其对应的1234值发生了什么?当这个字段被导出时,它应该是已经被marshaled了。要理解这个问题,我们必须澄清两件事情。...我们应该小心使用嵌入字段。虽然嵌入类型提升了其字段和方法有时会很方便,但同时也能导致细微的bug,因为父结构体也隐式的实现了该接口。当使用嵌入字段时,我么应该确保了解可能的副作用。 3.

    63020

    Kotlin与Java互操作

    当把平台值传递给期待非空值等的Kotlin函数时,也会触发一个断言。总的来说,编译器尽力阻止空值的传播(由于泛型的原因,有时这不可能完全消除)。...使注解像任何纯可空性注解一样工作,即对不当用法报错并影响注解声明内的类型在 Kotlin中的呈现; 对于 MigrationStatus.WARN,不当用法报为警告而不是错误; 但注解声明内的类型仍是平台类型...属性 Kotlin属性会被编译成以下Java元素: getter方法,其名称通过加前缀get得到; setter方法,其名称通过加前缀set得到(只适用于var属性); 私有字段,与属性名称相同(仅适用于具有幕后字段的属性...中的空值传入。...Kotlin在JVM虚拟机中运行时会检查所有的公共函数,可以检查非空值,这时候就可以通过NullPointerException得到Java中的非空值代码。

    3.9K30

    count(*)慢,该怎么办?

    你可能还记得在第 10 篇文章《 MySQL 为什么有时候会选错索引?》中我提到过,索引统计的值是通过采样来估算的。实际上,TABLE_ROWS 就是从这个采样估算得来的,因此它也很不准。...Redis 的数据不能永久地留在内存里,所以你会找一个地方把这个值定期地持久化存储起来。但即使这样,仍然可能丢失更新。...异常重启毕竟不是经常出现的情况,这一次全表扫描的成本,还是可以接受的。但实际上,将计数保存在缓存系统中的方式,还不只是丢失更新的问题。即使 Redis 正常工作,这个值还是逻辑上不精确的。...null,还要把值取出来再判断一下,不是 null 才累加。...count(*) 肯定不是 null,按行累加。看到这里,你一定会说,优化器就不能自己判断一下吗,主键 id 肯定非空啊,为什么不能按照 count() 来处理,多么简单的优化啊。

    47500

    三大反射定律

    空接口是一个非常重要的接口示例: interface{}或者它的别名: any它表示空方法集。因为每一个值都有零个或多个方法,所以它适用于任何值。 有人说Go的接口是动态类型的,这是错误的。...这就是为什么我们可以做到下面的原因:var w io.Writerw = r.(io.Writer)这是一个断言:它断言r中的项也实现了io.Writer,因此我们可以将其分配给w。...,即使x的静态类型是MyInt而不是int。...()的结果进行类型断言为float64;空接口值内部包含了具体值的类型信息,Printf将恢复它。...只要我们有结构的地址,我们就可以修改它的字段。下面是一个简单的例子,分析了一个结构值t。我们使用结构的地址创建了反射对象,因为我们将来会修改它。

    24610

    关于数据库中NOT NUll 的问题。

    则就可以判断为空 mysql探究之null与not null 相信很多用了mysql很久的人,对这两个字段属性的概念还不是很清楚,一般会有以下疑问: 1、我字段类型是not null,为什么我可以插入空值...首先,我们要搞清楚“空值” 和 “NULL” 的概念: 1、空值是不占用空间的 2、mysql中的NULL其实是占用空间的,下面是来自于MYSQL官方的解释 “NULL columns require...可见,NOT NULL 的字段是不能插入“NULL”的,只能插入“空值”,上面的问题1也就有答案了。...对于问题2,上面我们已经说过了,NULL 其实并不是空值,而是要占用空间,所以mysql在进行比较的时候,NULL 会参与字段比较,所以对效率有一部分影响。...而且对表索引时不会存储NULL值的,所以如果索引的字段可以为NULL,索引的效率会下降很多。 (以上为查的资料) 所以我觉得我是对的,等明天去了去在讨论讨论。

    1.5K40

    Java对象初始化顺序

    最近我发现了一个有趣的问题,这个问题的答案乍一看下骗过了我的眼睛。看一下这三个类: ? 运行 Lower 这个类可以得到什么输出?...是的,这个 lowerString 字段不再明确地设置为空。为什么这么做会有不同。不管怎样参考类型字段(例如这里的 String )的默认值不是为空的吗?当然是空的。...2.Lower 的一个实例被准备好了。意味着所有的字段都被创建并且填充了默认值,例如,引用类型的默认值为空,布尔类型的默认值为 false 。在这个时候,任何的对字段的内联赋值都没有发生。...通过使用有点肮脏的 instanceof 实例检查做到为那两个字段赋值 – 这不是一个特别好的设计模式,但是也有可行的,不用管那么多。...这是一个很好的例子,不仅方便我们如何注意一些创建对象的细节(或者知道去哪里查看 Java 编码规范,打印的或者在线的),还显示了为什么像这样写初始化是很糟糕的。

    82010
    领券