Java中null相关注解的实现
作者:JavGo6 发布时间:2022-09-24 06:31:59
在 Java 中,null 是一个表示“空值”的特殊值。相信大家都很了解 null 在 Java 中的作用,但是在开发过程中我们通常会遇到 null 相关的错误。为了避免这些错误,Java 引入了一系列和 null 相关的注解,让我们更好地解决和预防 null 相关的错误。
1. @Nullable
@Nullable 注解,它位于 javax.annotation 包中。该注解用于标注变量、参数、函数返回值等可以为 null 的情况。通常,这个注解被用于“可空”的情况下,以声明我们需要避免 null 指针错误,同时也为 IDE 和静态分析器提供更丰富的信息。通过使用 @Nullable,我们可以更加准确地描述代码的含义,提高代码的可读性和可维护性。同时,它也能够帮助开发者在编译期间发现潜在的问题,从而提高代码的质量和稳定性。
@Nullable 使用示例:
public static void doSomething(@Nullable String s) {
if (s != null) {
System.out.println(s);
}
}
注意:@Nullable 注解不能保护可能发生 NullPointerException 的代码,它只提供了有关代码的信息并帮助表明它们的用途。因此,在使用时,仅仅使用 @Nullable 注解是不够的,我们还需要编写代码来判断变量是否为 null,并在需要时进行处理。
2. @NonNull
@NonNull 是定义在 javax.annotation 包下的注解,它用于标注:
当方法调用完成后,被注释的返回值不能为空,如果为空将抛出 NullPointerException。
参数或字段即使你写了 null,它也不能为 null。如果为 null 就会抛出 NullPointerException。
使用 @NonNull 可以帮助我们编写更安全和更可靠的代码,强制约束对应的变量、参数和返回类型,防止空指针异常,并提供更有利的代码提示。@NonNull 有点像编写编译时代码时的断言,因此这对于保证代码正确性非常重要。
@NonNull 使用示例:
public static int add(@NonNull Integer a, @NonNull Integer b) {
return a + b;
}
注意:如果使用了 @NonNull 注解,则程序在有参数为 null 时会报 NullPointerException 异常。
3. @NotNull
@NotNull 是定义在 org.jetbrains.annotations 包下的注解,它主要用于增加安全性和可读性。与 @Nullable 和 @NonNull 类似,@NotNull 也是一种用于检查 null 的注解,提醒我们必须将这个参数设置为非 null。
@NotNull 使用示例:
public static boolean contains(@NotNull String[] strArr, @NotNull String str) {
for (String s : strArr) {
if (s.equals(str)) {
return true;
}
}
return false;
}
注意:与 @NonNull 不同的是,使用 @NotNull 注解在参数或返回值为 null 时,抛出的是 IllegalArgumentException 异常。
4. @NullableDecl
@NullableDecl 是定义在 com.google.errorprone.annotations 包下的注解,它表示标注的类型可以为 null,或者为空。它通常用于返回值或字段,并且可以与 @NonNullApi 注解配合使用。
@NullableDecl 使用示例:
public @NullableDecl Object getObject() {
return null;
}
注意:当返回类型为 null 时,可以使用 @NullableDecl 注解进行标注,然后可以通过 IDE 和静态分析器进行分析。
5. @NonNullApi
@NonNullApi 注解,它定义在 org.eclipse.jdt.annotation 包下。该注解可以用于注解包、类、构造函数、方法和属性。它的主要作用是指示被注解的元素是一个不允许参数、成员或返回值为 null 的 API。这意味着使用该 API 的代码必须确保在运行时不会出现 null 值,从而提高代码的健壮性和可靠性。
@NonNullApi 使用示例:
@NonNullApi
package com.example.demo;
//类中属性前加上@NonNull注解
class User {
@NonNull
private Integer id;
@NonNull
private String name;
public User(Integer id, String name) {
this.id = Objects.requireNonNull(id);
this.name = Objects.requireNonNull(name);
}
public Integer getId() {
return id;
}
public String getName() {
return name;
}
}
注意:注意 @NonNullApi 注解应该添加在每个支持此 Api 的类上,如果省略了 @NonNullApi 注解,意味着这个 API 不支持强制使用 @NonNull 注解。
6. @NullableApi
@NullableApi 是定义在 org.eclipse.jdt.annotation 包下的注解,与 @NonNullApi 类似,它主要用于注解一个包、类、构造函数、方法、属性,它表示该元素是支持为 null 的 API。
@NullableApi 使用示例:
@NullableApi
package com.example.demo;
//类中属性声明可以为null
class User {
@Nullable
private String address;
@Nullable
private String phone;
public User(String address, String phone) {
this.address = address;
this.phone = phone;
}
public void setAddress(@Nullable String address) {
this.address = address;
}
public void setPhone(@Nullable String phone) {
this.phone = phone;
}
public @Nullable String getAddress() {
return address;
}
public @Nullable String getPhone() {
return phone;
}
}
注意:@NullableApi 注解意味着参数、返回类型、字段可以为 null,并且 API 支持使用 @Nullable 注解进行标注。
7. @SuppressWarnings(“nullness”)
@SuppressWarnings(“nullness”) 注解可用于禁用 nullness 检查器,从而允许我们忽略在特定位置的 null 检查。这种注解可以提高代码的灵活性,允许我们在需要时绕过 null 检查,同时仍然保持代码的可读性和可维护性。此外,使用该注解还可以帮助我们更好地理解代码中的 null 值的处理方式,从而更好地优化代码的性能和可靠性。
@SuppressWarnings(“nullness”) 使用示例:
@SuppressWarnings("nullness")
public boolean isEmpty(String str) {
return str.length() == 0;
}
注意:@SuppressWarnings(“nullness”) 注解应谨慎使用,我们不应该盲目地使用它,应该仅在必要时使用。
来源:https://blog.csdn.net/ly1347889755/article/details/130255542


猜你喜欢
- 1、效果展示2、布局文件<?xml version="1.0" encoding="utf-8"
- 前言: 上图的报错信息相信大部分程序员都遇到过,奇怪的是虽然代码报错,但丝毫不影响程序的正常执行,也就是虽然编译器 IDEA 报错
- 开篇JDBC类型与Java类型并不是完全一一对应的。所以在PreparedStatement绑定参数的时候需要把Java类型转为JDBC类型
- 为了解决在多个窗口之间的传值问题,我们可以通过设置静态类和静态变量的办法来实现窗口间值的传递窗体一代码//窗体1的代码using Syste
- 前言在工作中经常遇到C#数组、ArrayList、List、Dictionary存取数据,但是该选择哪种类型进行存储数据,对于初学者的我一直
- 1、基础知识:Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。2、使用介绍1)、DOM(1)简介由W3C(org.w
- 本文项目为大家分享了C#实现点餐系统,供大家参考,具体内容如下项目介绍:一家店铺使用的外卖点餐系统本项目分三大模块:登录注册模块,用户模块,
- 本文实例为大家分享了C#实现订单管理程序的具体代码,供大家参考,具体内容如下订单管理的控制台程序,能够实现添加订单、删除订单、修改订单、查询
- 先随便搞个事件吧public class TestEventrgs : EventArgs {private st
- 本文实例为大家分享了C#实现简化QQ聊天窗口的具体代码,供大家参考,具体内容如下如图样式,详细步骤如下整个窗体设置private void
- WebService服务端代码public class WebServiceDemo : System.Web.Services.WebSe
- 下载maven 解压路径: 打开环境变量:右键此电脑-属性-高级系统设置-高级-环境变量添加以下系统变量:测试:win+
- 在Android上,不止一个途径来侦听用户和应用程序之间交互的事件。对于用户界面里的事件,侦听方法就是从与用户交互的特定视图对象截获这些事件
- 在LINUX上部署带有JAR包的JAVA项目首先eclipse上要装上一个小插件,叫做Fat Jar点击Fat Jar红框里选上主类点击Ne
- 通过输入流来读取客户端信息,相应的时候通过输出流来实现。服务端类的代码:import java.io.BufferedReader;impo
- spring boot与profilespring boot 的项目中不再使用xml的方式进行配置,并且,它还遵循着约定大于配置。静态获取方
- 最近看代码,由于代码的调用层级深度比较多,层层深入到某处时,已经忘记了身处何处,虽然自己可以使用一些画图工具来时序图,但是,这种情况下,自己
- 日志输出是所有系统必备的,很多开发人员可能因为常常使用log4j而忽视了JDK logging模块,两者之间是否有联系?是怎样的联系?JDK
- 机器学习 机器学习的目的是把数据转换成信息。 机器学习通过从数据里提取规则或模式来把数据转成信息。 人脸识别 人脸识别通过级联分类器对特征的
- 这篇文章主要介绍了Spring Cloud Sleuth整合zipkin过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一