可以在我知道不会为空的字段上使用断言吗?

Is it ok to use assert on a field I know won't be null?

通过阅读现有的帖子,我了解到 "assert" 不应在生产代码中使用,但是 IntelliJ 在使用我知道不会为 NULL 的方法时给我的第一个提示,但仍然可以为 Nullable在其他方面,就是告诉我应该使用 "assert"

在上面的代码中,当创建一个新的 ItemStack 时,ItemMeta 不会为 null,但是如果 ItemStack 也为 null,它可以为 null,这就是为什么它没有以 @NotNull 注释开头的原因。

知道了这一点,如何处理这个Warning才是最正确的呢?是因为我知道它永远不会为空而忽略它,还是仍然进行空检查。如果要进行空检查,断言或我已经在做的方式是

if(fillerMeta != null) 

I have come to learn that "assert" should not be used in production code

非常值得商榷。如果您断言 fillerMeta != null,您是在说这不能为 null 或我的代码存在严重错误。

非常好。但是如果你想断言某些东西,或者错误处理某些东西,你需要小心。断言 1 + 1 == 2 之类的东西很好,因为如果事实证明数学不能那样工作,那么您所做的所有其他假设也可能不在 window 范围内。所以程序直接爆炸就好了。

如果 fillerMeta 可能为空,因为它是例如 return 从您认为可能 return null 的函数中编辑的,您应该改为进行错误处理。例如。 if (fillerMeta == null) throw new Exception... 并优雅地处理它。

如果 fillerMeta 为 null 时您无法处理,或者如果它为 null 则不再允许您的特定函数 运行,请使用 Objects.requireNotNull,如果 fillerMeta 最终为空,它将抛出 NullPointerException。否则,如果它为 null 不会在很大程度上影响您的程序,只需使用 if (fillerMeta != null)

绕过它

更多附录:

is to tell me that I should use "assert"

不是,建议是"Assert not null"。这里有点猜测,但我假设 IntelliJ 不会在这里插入 assert() 语句,而是

  • Objects.reqireNotNull() 会抛出 NPE 或
  • 一些保护 if/else 结构,使您能够明确地为两种可能的情况编写代码

从这个角度来看:继续前进并让 Intellij "improve" 您的代码。看看它的作用,如果您不喜欢,只需撤消即可。