当试图访问一个空引用对象的属性或调用空引用对象的方法时,会抛出 NullPointer 异常。
通过下面的代码可以复现出问题。
String str = null;
System.out.println(str.length());
当试图访问一个空引用对象的属性或调用空引用对象的方法时,会抛出 NullPointer 异常。
通过下面的代码可以复现出问题。
String str = null;
System.out.println(str.length());
在Java中,为了避免在调用空引用对象的属性或方法时抛出NullPointerException
,你需要首先确保该对象不是null
。这通常通过进行空检查(null check)来实现。
下面是一些常见的方法来避免NullPointerException
:
在访问属性或调用方法之前,检查对象是否为null
。
String str = null;
if (str != null) {
System.out.println(str.length());
} else {
System.out.println("String is null");
}
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());
实现一个与原始对象具有相同接口但提供默认行为(而不是抛出异常)的空对象。
// 假设你有一个接口
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());
虽然这不是避免NullPointerException
的最佳方法,但你可以尝试捕获异常并在适当的情况下处理它。
try {
System.out.println(str.length());
} catch (NullPointerException e) {
System.out.println("String is null");
}
但是,通常不建议使用异常控制流程,因为异常处理应该用于处理异常情况,而不是用于正常的控制流程。
选择哪种方法取决于你的具体需求和代码风格。在大多数情况下,进行简单的空检查是最直接和最常用的方法。
这也是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()));
12 回答6k 阅读
2 回答3.2k 阅读✓ 已解决
3 回答7k 阅读✓ 已解决
3 回答3k 阅读✓ 已解决
5 回答4.6k 阅读
4 回答2.3k 阅读
3 回答4.7k 阅读
解决空指针异常问题,在使用对象之前,确保对象不为null。可以通过添加null检查或使用条件语句来避免该错误。
解决代码如下: