如何避免在Java中调用空引用对象的属性或方法时抛出NullPointerException?

当试图访问一个空引用对象的属性或调用空引用对象的方法时,会抛出 NullPointer 异常。

通过下面的代码可以复现出问题。

String str = null;
System.out.println(str.length());
阅读 3k
avatarAI BotBETA

在Java中,为了避免在调用空引用对象的属性或方法时抛出NullPointerException,你需要首先确保该对象不是null。这通常通过进行空检查(null check)来实现。

下面是一些常见的方法来避免NullPointerException

  1. 使用条件语句进行空检查

在访问属性或调用方法之前,检查对象是否为null

String str = null;
if (str != null) {
    System.out.println(str.length());
} else {
    System.out.println("String is null");
}
  1. 使用Optional类(Java 8及以上)

Optional类是一个可以为null的容器对象。如果值存在则isPresent()方法返回true,调用get()方法会返回该对象。

import java.util.Optional;

Optional<String> optionalStr = Optional.ofNullable(str);
optionalStr.ifPresent(s -> System.out.println(s.length()));
// 或者使用orElse或orElseGet来提供一个默认值
System.out.println(optionalStr.orElse("default").length());
  1. 使用空对象模式(Null Object Pattern)

实现一个与原始对象具有相同接口但提供默认行为(而不是抛出异常)的空对象。

// 假设你有一个接口
interface StringWrapper {
    int length();
    // 其他方法...
}

// 真实对象的实现
class RealStringWrapper implements StringWrapper {
    private final String str;

    RealStringWrapper(String str) {
        this.str = str;
    }

    @Override
    public int length() {
        return str.length();
    }
    // 其他方法实现...
}

// 空对象的实现
class NullStringWrapper implements StringWrapper {
    @Override
    public int length() {
        return 0; // 或者返回某个默认值
    }
    // 其他方法实现返回默认值或执行空操作...
}

// 使用时
StringWrapper wrapper = (str == null) ? new NullStringWrapper() : new RealStringWrapper(str);
System.out.println(wrapper.length());
  1. 使用Java 7的try-catch多异常捕获

虽然这不是避免NullPointerException的最佳方法,但你可以尝试捕获异常并在适当的情况下处理它。

try {
    System.out.println(str.length());
} catch (NullPointerException e) {
    System.out.println("String is null");
}

但是,通常不建议使用异常控制流程,因为异常处理应该用于处理异常情况,而不是用于正常的控制流程。

选择哪种方法取决于你的具体需求和代码风格。在大多数情况下,进行简单的空检查是最直接和最常用的方法。

3 个回答

解决空指针异常问题,在使用对象之前,确保对象不为null。可以通过添加null检查或使用条件语句来避免该错误。

解决代码如下:

if (str != null) {
    System.out.println(str.length());
}

这也是JAVA被很多人诟病的地方,JAVA认为空指针异常是要由程序员作判断并做处理的,即使是有了Optional(Java8引入),心智负担和代码复杂度也是只增不减。言归正传,一般有两种写法:

String str = null;
if(str != null){
    System.out.println(str.length());
}
String str = null;
Optional<String> a = Optional.ofNullable(str);
a.ifPresent(u -> System.out.println(str.length()));

自己写,每次记得判断。给别人写,防御性编程。


另外尝试一下Kotlin?

val str: String? = null;
println(str?.length)
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏