幹掉空指針異常

什麼是空指針異常

在Java裏,當一個變量的的值爲爲null時,表示一個不存在的對象,沒有分配內存地址,這時如果調用這個對象的方法或者訪問成員變量,就會出現空指針異常。如下

	String str = null;
	System.out.println(str.length());

如何避免空指針異常

代碼加判斷

在java的開發過程中,經常會遇到控制針異常,而且是不可預測的,但同時又給我們的代碼帶來了很嚴重的隱患。日常開發過程中,儘量避免出現NullPointException

  1. 非空判斷 例如上邊例子,可以在打印字符串長度的時候加上非空判斷
	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());
		}
	}
  1. jdk自帶的一種方式Objects.requireNonNull,可以比較方便的給出異常信息
    String string = Objects.requireNonNull(null,"不能爲null");
	System.out.println(string);
  1. equals比較時,常量放在前邊或者用Objects提供的方法
	String status=null;
    // 常量放在前邊
	if ("200".equals(status)){
		System.out.println(status);
	}
    // 利用Objects提供的方法
	if (Objects.equals("200",status)){
		System.out.println(status);
	}

  1. 對象初始化默認值,這個很好理解,只要有了初始值,再做操作時就不會出現空指針
  2. 斷言
	String userName = null;
    // spring的的靜態方法
    Assert.notNull(userName,"不能爲空!");
  1. Optional
    String userName = null;
	Optional<String> optional= Optional.ofNullable(userName);
	Assert.isTrue(optional.isPresent(),"不能爲空");
  1. 不相信任何他人提供的接口
  2. 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());
	}
  1. Guava的Preconditions
    userName = Preconditions.checkNotNull(userName,"不能爲空!");
	System.out.println(userName);

未完待續

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章