当前位置: 首页 > 面试题库 >

@Nonnull和Objects.requireNonNull有什么区别

孟杰
2023-03-14
问题内容

以下两个代码段之间有什么区别?

public Integer getId(@Nonnull SomeObject obj){  
    // do some stuff
    return id;
}

public Integer getId(SomeObject obj){   
    Objects.requireNonNull(SomeObject, "SomeObject is null");
    // do some stuff
    return id;
}

它们之间有什么显着差异。在这些情况下进行空值检查的正确方法是什么。


问题答案:

两者是互补的:@Nonnull注解记录了obj必须为非空的事实,而Objects.requireNonNull调用则确保obj运行时该值不为空。

您应该将两者结合起来,如下所示:

public Integer getId(@Nonnull SomeObject obj){   
    Objects.requireNonNull(SomeObject, "SomeObject is null");
    // do some stuff
    return id;
}

有关的文档@Nonnull可以在这里找到:

可选的类型注释不能替代运行时验证

在类型注释之前,用于描述可为空性或范围之类的内容的主要位置位于javadoc中。通过类型注释,此通信以一种编译时验证的方式进入字节码。

您的代码仍应执行运行时验证。



 类似资料:
  • 问题内容: 我注意到,Oracle JDK中使用了许多Java 8方法,如果给定的对象(参数)为,则会在内部抛出该方法。 但是,如果取消引用对象,则将被抛出。那么,为什么要做这个额外的null检查并抛出 ? 一个明显的答案(或好处)是它使代码更具可读性,我同意。我很想知道在方法开始时使用的其他原因 。 问题答案: 因为您可以这样做使事情变得 明确 。喜欢: 或更短: 现在您 知道了 : 当 成功使

  • 我注意到Oracle JDK中的许多Java 8方法使用,如果给定的对象(参数)是,则在内部抛出。 但是,如果对象被取消引用,则仍然会引发。那么,为什么要进行额外的空检查并抛出呢? 一个明显的答案(或好处)是它使代码更易读,我同意。我很想知道在方法开头使用的其他原因。

  • 问题内容: 两者都意味着空间,但是有什么区别吗? 问题答案: 一个是不间断空间,另一个是常规空间。不间断的空格表示该行不应在该点处换行,就像它不会在一个单词的中间换行一样。 此外,正如斯文德(Svend)在其评论中指出的那样,不间断的空间不会崩溃。

  • 本文向大家介绍<%# %> 和 <% %> 有什么区别?相关面试题,主要包含被问及<%# %> 和 <% %> 有什么区别?时的应答技巧和注意事项,需要的朋友参考一下 答:<%# %>表示绑定的数据源 <%%>是服务器端代码块  

  • 问题内容: 我发现不方便之处在于番石榴中的前提条件没有标注注释。考虑以下示例: 因此IDE找不到总是错误的。是否有任何特殊原因为什么不标记此前提条件(即使其参数是使用定义的)。 问题答案: 很抱歉,我们没有在任何地方使用过。为什么?我们尝试添加更多的空检查注释,发现: 添加所有其他注释非常冗长。 这就是我们所需要的。诚然,对于Guava开发人员而言,这比Guava用户更为重要。 似乎遇到了大多数问

  • 问题内容: 以下代码之间有什么区别: 和 Python建议采用一种做事方式,但有时似乎不止一种。 问题答案: 一个是函数调用,一个是文字: 使用第二种形式。它更具Python风格,并且可能更快(因为它不涉及加载和调用单独的函数)。