用 Optional.ofNullable 避免java出现空指针异常

java屏蔽了指针,但是空指针是个例外。java8 加入了Optional,可以更优雅的避免空指针异常。举例说明

package com.ioufev.mqtt.entities;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;

import java.util.Date;

/**
 * @Auther: Zg
 * @Date: 2023/1/4 - 01 - 04 - 22:27
 * @Description: com.ioufev.mqtt.entities
 * @version: 1.0
 */
@Data
@Builder
@Slf4j
@NoArgsConstructor
@AllArgsConstructor
public class Student {
    private Integer id;
    private String name;
    private String sex;
    private Date date;
}

方式1,传统方法,并不能检测出空指针:

    @SneakyThrows
    @Test
    void nullPointerExTest1() {
        Student stuNull = null;
        Student stu = Student.builder()
                .id(1)
                .date(new Timestamp(new Date().getTime()))
                .name("antetokounmpo")
                .sex("male")
                .build();

        //方式一:不能检测出空指针:
        Map<String, Object> map = new HashMap<>();

        Field[] fields = stuNull.getClass().getDeclaredFields();

        for (Field f : Arrays.asList(fields)
             ) {
            f.setAccessible(true);

            map.put(f.getName(),f.get(stuNull));
        }

        for (Map.Entry<String,Object> entry : map.entrySet()
        ) {
            log.info(entry.getKey() +"---->"+entry.getValue());
        }
    }

在这里插入图片描述

方式2:虽然也出现了空指针,但是直接跳转到了 new Field[]{} 避免了空指针

    @SneakyThrows
    @Test
    void nullPointerExTest2(){
        Student stuNull = null;
        Student stu = Student.builder()
                .id(1)
                .date(new Timestamp(new Date().getTime()))
                .name("antetokounmpo")
                .sex("male")
                .build();

        //方式二:能检测出空指针:
        Map<String, Object> map = new HashMap<>();

        Field[] fields = Optional.ofNullable(stuNull)
                .map(x -> x.getClass())
                .map(y -> y.getDeclaredFields())
                .orElse(new Field[]{});


        for (Field f : Arrays.asList(fields)
        ) {
            f.setAccessible(true);

            map.put(f.getName(),f.get(stuNull));
        }

        for (Map.Entry<String,Object> entry : map.entrySet()
        ) {
            log.info(entry.getKey() +"---->"+entry.getValue());
        }
    }

在这里插入图片描述

正确的写法:

    @Test
    void nullPointerExTest3(){
        Student stuNull = null;
        Student student = new Student();
        Student stu = Student.builder()
                .id(1)
                .date(new Timestamp(new Date().getTime()))
                .name("antetokounmpo")
                .sex("male")
                .build();

        //方式二:能检测出空指针:
        Map<String, Object> map = new HashMap<>();

        Field[] fields = Optional.ofNullable(student)
                .map(Student::getClass)
                .map(Class::getDeclaredFields)
                .orElse(new Field[]{});


        Arrays.asList(fields).forEach(field -> {
            field.setAccessible(true);
            try {
                map.put(field.getName(),field.get(stu));
            }

            catch (IllegalAccessException e) {
                e.printStackTrace();
            }
        });

        map.entrySet().forEach(entry->{
            log.info(entry.getKey()+"---->"+ entry.getValue());
        });
    }

在这里插入图片描述

C# 中 有更优雅的写法:

            EmployeeInfo employeeInfo = new EmployeeInfo();

            string s = (employeeInfo?.EmpPYNo); 
            //判断employeeInfo 是否为null。 如果为null则不执行后面的方法,属性,直接返回null


            string ss = employeeInfo.Phone ?? employeeInfo.EmpName; 
            //如果employeeInfo.Phone 存在则返回左边,否则右边
### 回答1: optional.ofnullable的作用是创建一个Optional对象,该对象可以包含一个非空值或者为空。如果传入的值为null,则返回一个空的Optional对象,否则返回一个包含传入值的Optional对象。这个方法可以用来避免空指针异常,同时也可以方便地处理可能为空的值。 ### 回答2: optional.ofNullable的作用是将一个可能为null的对象包装成Optional对象。 在Java编程中,经常会遇到需要处理可能为null的对象的情况。在使用这些对象时,如果没有对其进行判空处理,就有可能发生空指针异常。为了避免这种情况的发生,可以使用Optional类来对可能为null的对象进行包装,并提供了一系列的操作方法来处理这些对象。 optional.ofNullable方法接受一个对象作为参数,该对象可以是任意类型,可以是null。如果传入的对象是null,那么ofNullable方法会返回一个空的Optional对象;如果对象不为null,那么ofNullable方法会将该对象包装成一个非空的Optional对象。 使用optional.ofNullable方法包装对象后,我们可以使用Optional类提供的其他方法来处理这个对象。例如,可以通过调用.isPresent()方法判断对象是否有值,如果有值则返回true,否则返回false。还可以通过调用.get()方法获取对象的值,如果对象为null,将会抛出NoSuchElementException异常。 通过使用optional.ofNullable方法,我们可以更加方便、安全地处理可能为null的对象。它提供了一种优雅的方式来处理null情况,使得代码更加简洁,并且减少了空指针异常的风险。同时,Optional类的方法也提供了一些便捷的操作,例如使用.map()方法可以对包装的对象进行映射操作,使用.orElse()方法可以设置默认值等。 总之,optional.ofNullable方法的作用是将一个可能为null的对象包装成Optional对象,提供了更加安全、便捷的处理方式。 ### 回答3: optional.ofNullableJava 8中的一个静态方法,它的作用是将一个可能为null的对象包装成Optional对象。 OptionalJava 8中引入的一个类,用于避免空指针异常。它提供了一种优雅的方式来处理可能为空的对象,可以使代码更加简洁和可读。 optional.ofNullable方法接收一个对象参数,如果该对象为null则返回一个空的Optional对象,否则将该对象包装为Optional对象。换句话说,optional.ofNullable方法的作用就是将一个可能为null的对象转化为Optional对象。 使用optional.ofNullable可以在代码中避免繁琐的null检查操作,从而提高代码的可读性和可维护性。通过调用Optional对象的一些方法,如isPresent(), ifPresent(), orElse()等,我们可以更加优雅地处理可能为空的对象。 例如,假设我们有一个可能为null的字符串对象str,我们可以使用optional.ofNullable方法将其包装为一个Optional对象,然后通过调用Optional对象的方法来处理这个可能为空的字符串对象,如下所示: ```java String str = null; Optional<String> optionalStr = Optional.ofNullable(str); optionalStr.ifPresent(s -> System.out.println("字符串为:" + s)); ``` 在上面的代码中,如果str为null,则optionalStr为一个空的Optional对象,ifPresent方法不会执行。如果str不为null,则ifPresent方法会执行,输出字符串为:(str的值)。 可以看出,optional.ofNullable方法提供了一种简洁且类型安全的方式来处理潜在的空指针异常,使得代码更加健壮和可读。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潘诺西亚的火山

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值