Java14发布了,再也不怕NullPointerException了

Java14发布了,再也不怕NullPointerException了

自从Java诞生以来,空指针异常NullPointerException就一直是开发者最常见的错误之一。但是,随着Java版本的更新,我们终于迎来了一次改变。Java14发布了,它带来了一系列的特性和改进,其中最引人注目的就是JDK Enhancement Proposal 358(JEP 358),它为我们提供了新的Null安全特性,可以大幅减少NullPointerException的出现。下面,我们就来详细了解一下这一特性的使用方法和操作步骤吧!

1. 什么是JEP 358

JEP 358的全称是向Java语言和虚拟机中加入特定的非空引用和空指针检查。它所提供的空安全非常实用,可以让开发者在编写代码时更加自信地规避NullPointerException,避免因这个错误导致应用程序崩溃。具体来说,JEP 358主要包括以下几个方面的改进:

  • 引入非空类型以禁止null赋值和null解引
  • 引入了 ? 对象运算符,它可以为空的对象返回 null,而不是抛出 NullPointerException
  • 提供了新的API,以更安全的方式访问可能为null的对象

2. 如何使用JEP 358

2.1 非空类型

非空类型是JEP 358引入的首个新特性。它可以让我们在编写代码时明确声明一个变量是非空的,从而避免在后续访问时出现NullPointerException。在Java14中,我们可以使用注解 @NonNull来声明一个变量是非空的,如下所示:

public class Laptop {
    private String brand;
    public Laptop(@NonNull String brand) {
        this.brand = brand;
    }
    public @NonNull String getBrand() {
        return brand;
    }
}

在上面的代码中,我们使用了@NonNull注解声明了brand变量是非空的。如果我们在调用brand变量时忘记了进行空值判断,编译器会提醒我们,从而避免了NullPointerException的发生。

2.2 ? 对象运算符

? 对象运算符是JEP 358引入的另一个新特性。它可以用来简化对可能为null的对象的访问,以减少NullPointerException的出现。如果要使用 ? 对象运算符,需要至少Java 14及以上版本。下面是一个对比示例:

// 在Java 14之前,访问可能为null的对象需要进行空值判断
if (str != null) {
    return str.length();
} else {
    return -1;
}

// 在Java 14中,可以使用 ? 运算符来判断
return str?.length() ?: -1;

可以看出,在Java14中,访问可能为null的对象变得更加简洁了,同时也能够更好地提高代码的可读性。

2.3 新API

除了上述两个新特性,JEP 358还提供了一组新的API,以更安全地访问可能为null的对象。在Java14中,我们可以使用Optional类和新的Stream方法来实现这一点。下面是一个使用Optional类的示例:

Optional<String> opt = Optional.ofNullable(user.getName());
String name = opt.orElse("Unknown");

在上面的代码中,我们使用了Optional类来避免了代码中出现空值异常。如果user对象的getName()方法返回null,我们就可以使用orElse()方法来代替其返回一个默认值。

3. 示例说明

在本示例中,我们假设有一个名为Student的类,它包含了学生的姓名和所学课程的信息,并且其中的字段都需要进行非空判定。

首先,在Student类中,我们可以通过在变量前加上@NonNull注解来标记这是一个非空变量,如下所示:

public class Student {
    private @NonNull String name;
    private List<@NonNull String> courses;

    public Student(String name) {
        this.name = Objects.requireNonNull(name);
        this.courses = new ArrayList<>();
    }

    // getter和setter
    public @NonNull String getName() {
        return name;
    }
    public void setName(@NonNull String name) {
        this.name = name;
    }
    public List<@NonNull String> getCourses() {
        return courses;
    }
    public void setCourses(List<@NonNull String> courses) {
        this.courses = courses;
    }
}

在上面的代码中,我们使用了@NonNull注解来标记name字段和courses列表都是非空的。此外,我们在构造函数中使用了Objects.requireNonNull()方法来判断传入的name参数是否为空,以确保变量的非空性。

接着,我们可以在应用程序中使用Java14中的 ? 运算符,来访问courses列表中的元素,如下所示:

Student stu = new Student("张三");
String firstCourse = stu.getCourses().stream().findFirst().orElse(null);

在上述代码中,我们使用了findFirst()方法来查找courses列表中的第一个元素,如果列表为空,则返回null值。这样,我们就避免了在访问courses列表时出现NullPointerException的风险。

最后,我们再来看一个使用Optional类的示例,如下所示:

Student stu = new Student("张三");
Optional<String> optionalName = Optional.ofNullable(stu.getName());
String name = optionalName.orElse("Unknown");

在上述代码中,我们使用Optional类来包装stu.getName()方法返回的值。如果该方法返回null,那么我们使用orElse()方法来代替其返回一个默认值。

4. 总结

通过以上详细的讲解,相信大家对Java14中的JEP 358特性都有了更深入的理解和认识。在应用程序中使用该特性可以使我们的程序更加健壮、更加安全,避免了由于NullPointerException而带来的不可预知的风险。因此,我们在进行Java开发时,一定要多多掌握和使用该特性。

阅读剩余 61%

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Java14发布了,再也不怕NullPointerException了 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • java 使用ElasticSearch完成百万级数据查询附近的人功能

    下面是详细的“java 使用ElasticSearch完成百万级数据查询附近的人功能”的攻略: 一、准备工作 1. 安装Elasticsearch 首先需要在本地安装Elasticsearch,可以到官方网站下载并安装。也可以使用Docker进行安装。 2. 安装Elasticsearch客户端 在Java代码中使用Elasticsearch,需要引入Ela…

    Java 2023年5月20日
    00
  • 在Java代码中解析html,获取其中的值方法

    要在Java代码中解析html,获取其中的值,可以使用Jsoup这个第三方开源库。下面是使用Jsoup的步骤: 第一步:导入Jsoup库 使用Maven导入依赖: <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId…

    Java 2023年5月26日
    00
  • Java JDBC API介绍与实现数据库连接池流程

    Java JDBC API介绍与实现数据库连接池流程 JDBC API介绍 Java Database Connectivity(JDBC)是一个Java API,让Java应用程序与关系型数据库进行交互。JDBC API允许开发人员执行SQL查询和更新以及事务处理。 JDBC API的主要组成部分是: DriverManager类:负责创建数据库连接。 C…

    Java 2023年5月19日
    00
  • Java GUI实现学生成绩管理系统

    作为Java GUI实现学生成绩管理系统的作者,以下是详细的攻略: 1. 学习Java GUI 首先需要熟悉Java GUI相关的知识,包括Swing和AWT等基础知识。可以通过在线课程、教程和书籍等途径来学习。 2. 设计学生成绩管理系统 在学习了Java GUI基础知识之后,开始设计学生成绩管理系统。首先需要确定系统的功能和界面设计,包括成绩录入、成绩查…

    Java 2023年5月24日
    00
  • java中JDBC增删改查操作详解

    Java中JDBC增删改查操作详解 JDBC(Java Database Connectivity)是Java程序访问数据库的标准API。学习JDBC可以帮助我们了解如何在Java程序中对数据库进行增删改查等操作。 本教程将详细讲解Java中JDBC的增删改查操作,包括以下部分: JDBC环境搭建 数据库的增删改查操作 示例 JDBC环境搭建 在使用JDBC…

    Java 2023年5月19日
    00
  • JavaScript 字符串乘法

    当我们需要将一个字符串重复多次时,我们可以使用字符串乘法操作。JavaScript中字符串乘法的语法很简单,就是使用字符串和一个数字相乘,如下所示: string * number 其中,string表示要乘的字符串,number表示要重复的次数。这个操作返回一个新的字符串,是将原字符串重复指定次数后的结果。 下面我们来看两个具体的示例: 示例一 我们有一个…

    Java 2023年5月27日
    00
  • java中如何截取字符串最后一位

    在Java中,可以使用String类中的substring()方法来截取字符串。若想截取字符串的最后一位,则可以结合字符串的长度和substring()方法来实现。 具体实现步骤如下: 获取字符串的长度,可以使用String类中的length()方法。 将length()方法返回的结果减1,得到字符串最后一位的下标位置。 使用substring()方法来截取…

    Java 2023年5月27日
    00
  • Spring Security实现HTTP认证

    让我来分享一下关于“Spring Security实现HTTP认证”的完整攻略。 Spring Security简介 Spring Security 是一个能够为基于 Spring 的企业应用系统提供声明式的安全访问控制解决方案的安全框架。Spring Security 提供了一组可以在 Spring 应用上下文中配置的 Bean,充分利用了 Spring …

    Java 2023年6月3日
    00
合作推广
合作推广
分享本页
返回顶部