Java8的Stream方法findAny空指針異常(NullPointerException)實例對比


實戰介紹

學習完Java8的Stream方法,可能你正准備大展身手,卻發現遇到不少問題,本篇文章為大家帶來一個findAny方法拋出java.lang.NullPointerException的場景。

實戰內容

先看一下下面的代碼,猜測一下執行之后會打印什么?

public class FindAnyTest {

	@Test
	public void test() {
		List<Foo> list = new ArrayList<>();
		list.add(new Foo());

        // 方法一
		Integer id = list.stream().map(Foo::getId).findAny().orElse(null);

		System.out.println(id);
		
        // 方法二
		id = list.stream().findAny().map(Foo::getId).orElse(-1);
		System.out.println(id);
	}
}

class Foo {
	Integer id;

	public Integer getId() {
		return this.id;
	}
}

然后,執行單元測試方法,你會發現方法一拋出了異常:

java.lang.NullPointerException

如果刪除方法一,只執行方法二,則不會出現異常。為什么呢?

具體分析

首先方法一種,list.stream().map(Foo::getId)通過map,對原來的Stream進行了轉換,生成了一個新的Stream,而該Stream中值是Foo的id屬性,默認為null。針對一個元素為null的Stream調用findAny(),當然就拋出異常了。

而方法二,list.stream().findAny()獲得是Optional ,然后對Optional 調用map方法獲得的是Optional ,而Optional 里面的值為null,再調用orElse方法卻不會出現問題。

調整操作

如果對原來的整個操作進行修改,則可正常執行,那就是設置Foo對象的id默認值不為null,或者給id賦值非null值。再次執行就不會出現異常。但這並不是解決問題的根本,只是為了演示結果。

原文鏈接:《Java8的Stream方法findAny空指針異常(NullPointerException)實例對比


程序新視界:精彩和成長都不容錯過
![程序新視界-微信公眾號](https://img2018.cnblogs.com/blog/1742867/201910/1742867-20191013111755842-2090947098.png)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM