如何优雅的避免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

目录
相关文章
|
10天前
|
安全 Java 开发者
NullPointerException:拥抱Java Optional-6
NullPointerException:拥抱Java Optional
197 104
|
10天前
|
安全 Java 容器
NullPointerException:拥抱Java Optional-5
NullPointerException:拥抱Java Optional
163 107
|
10天前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional-4
告别NullPointerException:拥抱Java Optional-4
160 104
|
10天前
|
安全 Java 开发者
告别NullPointerException:拥抱Java Optional
告别NullPointerException:拥抱Java Optional
|
4月前
|
Java 程序员 数据库连接
我们详细地讲解一下 Java 异常及要如何处理
我是小假 期待与你的下一次相遇 ~
|
6月前
|
存储 Java API
Java Optional 完全指南:彻底告别 NullPointerException
Java 8 引入的 `Optional` 类旨在解决 `null` 带来的空指针异常问题,通过提供容器类显式处理可能为空的值,提升代码健壮性和可读性。本文从基础到进阶解析 `Optional` 的用法,涵盖创建、检查、获取值、处理值等核心功能,结合实际应用场景与最佳实践,助你彻底告别 `NullPointerException`,编写更优雅的 Java 代码。
308 0
|
7月前
|
SQL druid Oracle
【YashanDB知识库】yasdb jdbc驱动集成druid连接池,业务(java)日志中有token IDENTIFIER start异常
客户Java日志中出现异常,影响Druid的merge SQL功能(将SQL字面量替换为绑定变量以统计性能),但不影响正常业务流程。原因是Druid在merge SQL时传入null作为dbType,导致无法解析递归查询中的`start`关键字。
|
7月前
|
SQL Java 中间件
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
在BeetISQL 2.13.8版本中,客户使用batch insert向yashandb表插入数据并尝试获取自动生成的sequence id时,出现类型转换异常。原因是beetlsql在prepareStatement时未指定返回列,导致yashan JDBC驱动返回rowid(字符串),与Java Bean中的数字类型tid不匹配。此问题影响业务流程,使无法正确获取sequence id。解决方法包括:1) 在batchInsert时不返回自动生成的sequence id;2) 升级至BeetISQL 3,其已修正该问题。
【YashanDB知识库】yasdb jdbc驱动集成BeetISQL中间件,业务(java)报autoAssignKey failure异常
|
8月前
|
Java 程序员 开发者
Java社招面试题:一个线程运行时发生异常会怎样?
大家好,我是小米。今天分享一个经典的 Java 面试题:线程运行时发生异常,程序会怎样处理?此问题考察 Java 线程和异常处理机制的理解。线程发生异常,默认会导致线程终止,但可以通过 try-catch 捕获并处理,避免影响其他线程。未捕获的异常可通过 Thread.UncaughtExceptionHandler 处理。线程池中的异常会被自动处理,不影响任务执行。希望这篇文章能帮助你深入理解 Java 线程异常处理机制,为面试做好准备。如果你觉得有帮助,欢迎收藏、转发!
497 14
|
21天前
|
数据采集 存储 弹性计算
高并发Java爬虫的瓶颈分析与动态线程优化方案
高并发Java爬虫的瓶颈分析与动态线程优化方案