簡體   English   中英

在方法參考表達式評估中進行空檢查的原因是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM