如何优雅的避免Java中:NullPointerException(空指针异常)

简介: 如何优雅的避免Java中:NullPointerException(空指针异常)

1:空指针问题

Java是没有指针的,所以我们常说"Java 指针"就是指"Java 的引用"。空指针就是空引用,Java空指针异常就是引用本身为空,但却调用了方法,这个时候就会出现空指针异常

public class demo {
    public static void main(String[] args) {
        Address address = new Address();
        User user = new User("xia", 12, address);
        String cityName = user.getAddress().getCity().trim();
        System.out.println(cityName);
    }
}
Address:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class Address {
    private String city;
    private String address;
}
User:
@Data
@NoArgsConstructor
@AllArgsConstructor
public class User {
    private String name;
    private Integer age;
    private Address address;
}

7783eb2a1912415999a75a31bbeb5328.png

2:解决方法

第一种方式:

使用if 来进行非空判断

/**
     使用if 条件判断,但是这种写法不优美
*/
public class demo {
    public static void main(String[] args) {
        Address address = new Address();
        User user = new User("xia", 12, address);
        if (user != null){
            Address userAddress = user.getAddress();
            if (userAddress != null) {
                String city = address.getCity();
                if (city != null && !"".equals(city)){
                    System.out.println(user.getAddress().getCity().trim());
                }
            }
        }
    }
}

第二种方式:

使用Optional.ofNuallable 来进行处理

public class demo {
    public static void main(String[] args) {
        Address address = new Address();
        User user = new User("xia", 12, address);
        String ored = Optional.ofNullable(user)
                .map(User::getAddress)
                .map(Address::getCity)
                .map(String::trim)
                .orElse("default");
        System.out.println(ored);
    }
}

第三种方式:

使用Assert 断言

public class demo {
    public static void main(String[] args) {
        Address address = new Address();
        User user = new User("xia", 12, address);
        getUserCity(user);
        try {
            TimeUnit.SECONDS.sleep(10);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        getUserCity(null);
    }
    public static void getUserCity(User user){
        Assert.notNull(user,"user is null");
        Address address = user.getAddress();
        Assert.notNull(address,"address is null");
        String city = address.getCity();
        System.out.println(city);
    }
}

第四种方式:

使用@Nullable 注解(代码会有提示)

public class demo {
    public static void printString(@Nullable String str){
        System.out.println(str.toString());
    }
    @Nullable
    public static String getString(){
        return null;
    }
    public static void main(String[] args) {
        Address address = new Address();
        String str = null;
        printString(str);
        getString().toString();
        User user = new User();
        System.out.println(user.getAddress().getCity());
    }
}

提示:

eb27285176014dbf85f51a5304c0765b.png

目录
相关文章
|
4天前
|
存储 设计模式 缓存
从一个 NullPointerException 探究 Java 的自动装箱拆箱机制
这行代码一个对象方法都没有调用,怎么会抛出 NullPointerException 呢?
21 9
|
1天前
|
Java
如何在 Java 中处理“Broken Pipe”异常
在Java中处理“Broken Pipe”异常,通常发生在网络通信中,如Socket编程时。该异常表示写入操作的另一端已关闭连接。解决方法包括:检查网络连接、设置超时、使用try-catch捕获异常并进行重试或关闭资源。
|
4天前
|
存储 安全 Java
如何避免 Java 中的“ArrayStoreException”异常
在Java中,ArrayStoreException异常通常发生在尝试将不兼容的对象存储到泛型数组中时。为了避免这种异常,确保在操作数组时遵循以下几点:1. 使用泛型确保类型安全;2. 避免生类型(raw types)的使用;3. 在添加元素前进行类型检查。通过这些方法,可以有效防止 ArrayStoreException 的发生。
|
5天前
|
人工智能 Oracle Java
解决 Java 打印日志吞异常堆栈的问题
前几天有同学找我查一个空指针问题,Java 打印日志时,异常堆栈信息被吞了,导致定位不到出问题的地方。
18 2
|
8天前
|
Java 索引
如何避免在 Java 中引发`StringIndexOutOfBoundsException`异常
在Java中,处理字符串时若访问了不存在的索引,会抛出`StringIndexOutOfBoundsException`异常。为避免此异常,应确保索引值在有效范围内,例如使用`length()`方法检查字符串长度,并确保索引值不小于0且不大于字符串长度减1。
|
10天前
|
安全 Java 数据安全/隐私保护
如何配置 Java 安全管理器来避免访问控制异常
配置Java安全管理器以防止访问控制异常,需在启动JVM时通过 `-Djava.security.manager` 参数启用,并设置安全策略文件,定义权限规则,限制代码执行操作,确保应用安全。
|
13天前
|
Java
Java“NullPointerException”解决
Java中的“NullPointerException”是常见的运行时异常,发生在尝试使用null对象实例的方法或字段时。解决方法包括:1. 检查变量是否被正确初始化;2. 使用Optional类避免null值;3. 增加空指针检查逻辑。
|
6天前
|
Java 容器
Java“NullPointerException”解决
Java中的“NullPointerException”是当程序试图使用一个空对象引用时抛出的异常。解决方法包括:检查变量是否为null、使用Optional类、利用断言和合理初始化变量等。确保代码健壯性,避免运行时错误。
|
3天前
|
监控 安全 Java
在 Java 中使用线程池监控以及动态调整线程池时需要注意什么?
【10月更文挑战第22天】在进行线程池的监控和动态调整时,要综合考虑多方面的因素,谨慎操作,以确保线程池能够高效、稳定地运行,满足业务的需求。
71 38
|
5天前
|
Java 调度
[Java]线程生命周期与线程通信
本文详细探讨了线程生命周期与线程通信。文章首先分析了线程的五个基本状态及其转换过程,结合JDK1.8版本的特点进行了深入讲解。接着,通过多个实例介绍了线程通信的几种实现方式,包括使用`volatile`关键字、`Object`类的`wait()`和`notify()`方法、`CountDownLatch`、`ReentrantLock`结合`Condition`以及`LockSupport`等工具。全文旨在帮助读者理解线程管理的核心概念和技术细节。
18 1
[Java]线程生命周期与线程通信