java语言很容易出现NullpointException,如何在代码编写阶段就发现问题并且简化代码呢?
1.编写工具类来简化判空表达式
if (sampleString != null && !sampleString.equals("")) {
// ...
}
if (sampleList != null && sampleList.size() != 0) {
// ...
}
觉得上面的判空太过复杂?没关系,写个工具类,或者直接用 EmptyUtils
public static boolean isEmpty(CharSequence text) {
return text == null || text.toString().equals("");
}
public static <T> boolean isEmpty(Collection<T> collection) {
return collection == null || collection.isEmpty();
}
2.习惯的养成
1.对于容器,比如ArrayList
,retrun Collections.emptyList()
而不是null
;
2.对于字符串,return ""
; 而不是return null
;
3.对于其他对象,如果可以定义空对象/初始对象,则return这个对象。否则,return null
;
4.对于请求从服务器返回的数据结构,每一层都需要判空,不然很容易出现空指针
3.使用注解
@NonNull
public String testNullPoint() {
return null;//这里会有黄色的inspection
}
@Nullable
public String testNullPoint() {
return null;//这里正常
}
默认情况下android studio默认会使用android.support.annotation
中的annotation来做nullity的分析,如果你想更换,也可以自行更改配置:Settings
--Editor
--Inspections
里搜索Null,然后 找到Java | Probable bugs | @NotNull/@Nullable problems,点击configure annotation即可.
4.使用Optional<T>
java8自带了Optional<T>类来解决NPE问题,但是这要求minSDK必须为24,所以我们可以自己实现,直接贴代码:
import java.util.Objects;
public class Optional<T> {
private T value;
private Optional() {
this.value = null;
}
private Optional(T value) {
this.value = Objects.requireNonNull(value);
}
public static<T> Optional<T> empty() {
return new Optional<>();
}
public static<T> Optional<T> of(T value) {
return new Optional<>(value);
}
public interface Action<T> {
void apply(T value);
}
public void ifPresent(Action<T> action) {
if (value != null) {
action.apply(value);
}
}
}