什麼是空指針異常
在Java裏,當一個變量的的值爲爲null
時,表示一個不存在的對象,沒有分配內存地址,這時如果調用這個對象的方法或者訪問成員變量,就會出現空指針異常。如下
String str = null;
System.out.println(str.length());
如何避免空指針異常
代碼加判斷
在java的開發過程中,經常會遇到控制針異常,而且是不可預測的,但同時又給我們的代碼帶來了很嚴重的隱患。日常開發過程中,儘量避免出現NullPointException
。
- 非空判斷 例如上邊例子,可以在打印字符串長度的時候加上非空判斷
String str = null;
System.out.println(str != null ? str.length() : -1);
當然不同的數據類型,判空方式不一樣,例如
// list的判空
List<String> list = null;
if (CollectionUtils.isNotEmpty(list)) {
for (int i = 0; i <list.size(); i++) {
System.out.println(list.get(i));
}
}
// map的判空
Map<String, String> map = null;
if (MapUtils.isNotEmpty(map)) {
for (Map.Entry<String, String> entry : map.entrySet()) {
System.out.println(entry.getKey() + "-" + entry.getValue());
}
}
- jdk自帶的一種方式
Objects.requireNonNull
,可以比較方便的給出異常信息
String string = Objects.requireNonNull(null,"不能爲null");
System.out.println(string);
- equals比較時,常量放在前邊或者用
Objects
提供的方法
String status=null;
// 常量放在前邊
if ("200".equals(status)){
System.out.println(status);
}
// 利用Objects提供的方法
if (Objects.equals("200",status)){
System.out.println(status);
}
- 對象初始化默認值,這個很好理解,只要有了初始值,再做操作時就不會出現空指針
- 斷言
String userName = null;
// spring的的靜態方法
Assert.notNull(userName,"不能爲空!");
- Optional
String userName = null;
Optional<String> optional= Optional.ofNullable(userName);
Assert.isTrue(optional.isPresent(),"不能爲空");
- 不相信任何他人提供的接口
- lombok非空判斷,目前不太友好的是,不能自定義提示信息
public static void main(String[] args) {
String userName = null;
test(userName);
}
public static void test([@NonNull](https://my.oschina.net/u/2981441) String userName) {
System.out.println(userName.length());
}
- Guava的Preconditions
userName = Preconditions.checkNotNull(userName,"不能爲空!");
System.out.println(userName);
未完待續