[英]What is the reason behind null checks in method reference expression evaluation?
有很多問題,人們已經意識到使用計算結果為null
值的表達式創建方法引用將導致NullPointerException
。 舉個例子:
String s = null;
Supplier<char[]> fun = s::toCharArray;
這是由於java規范中的以下段落:
首先,如果方法引用表達式以ExpressionName或Primary開頭,則計算此子表達式。 如果子表達式的計算結果為null,則會引發NullPointerException,並且方法引用表達式會突然完成。 如果子表達式突然完成,則方法引用表達式會出於同樣的原因突然完成。
現在我的問題是,有沒有人碰巧知道背后的原因(基於許多困惑的問題)反直覺規范是什么?
我唯一想到的是,在以下情況下,如果在評估Supplier
期間發生NullPointerException
,則很難准確報告錯誤:
public static char[] callback(Supplier<char[]> supplier) {
return supplier.get();
}
public static void main(String[] args) {
String s = null;
callback(s::toCharArray);
}
這里的原因是,當您創建非靜態方法引用時,它必須能夠訪問this
。 當您嘗試創建對null對象的引用時,在任何地方都沒有this
,這就是為什么它應該在此步驟失敗,而不是在第一次使用時在代碼中的某個地方失敗。
想象一下,在一個地方你得到了對象,在某處保存它的方法引用,而不是在完全不同的代碼部分中使用它。 你會得到一個NPE,而不是在出錯的地方,但是很多行代碼都沒有。
因為Java編譯器不是linter / logic checker。
Java中沒有任何內容阻止您通過取消引用null
來觸發NPE。
例如,Java不會阻止您執行以下操作:
String s = null;
s.toString();
這是在Java 8之前,今天仍然是方法參考。
您引用的段落僅詳細說明了JVM 在運行時如何處理方法引用的這一點,即如果方法引用評估的一部分失敗,整個評估將失敗。
請注意,在您的實際示例中,您的IDE可能會發出警告,因為潛在錯誤的范圍非常緊張。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.