[英]Java equality check and dispatch algorithms
有時在我的代碼中,我必須檢查某個變量是否等於常量字符串。 例如:
if (foo.equals("CONST")) {
stuff.do();
}
有時foo為null
所以我得到了null指針異常。 一種解決方法是像這樣簡單地交換對象和參數:
if ("CONST".equals(foo)) {
stuff.do();
}
我已經讀到這與Java是一種調度語言有關,但是我不明白為什么。 如果foo
為null,則將在null對象上調用方法,這將導致null指針異常。 它與單次調度(或多次調度,動態調度等)有什么關系? 這個問題與任何派遣概念有關嗎?
不完全是,在第一種情況下,您要調用equals表示null會導致問題;在第二種情況下,您要在調用“ CONST”而不是null時,foo只是一個參數,而equals不會被調用。
您所讀的只是關於每個對象都是Object.class的擴展。 實際上,這意味着從Object.class到Custom.class的最新實現擴展Object.class只能做一個層次結構。
但是null不是Object。
這意味着您不能在null上使用Dispatch機制,當它找到null引用時,它將引發NullPointerException。
這與Java無關,僅與分派機制的工作方式(多種或單一類型)無關
ps:在某些語言中,您可以創建從多個超類擴展的類。 Java不會這樣做是為了避免出現鑽石問題(您從方法名稱相同的2個類擴展而來。編譯器看起來它們做了不同的事情,並且不知道如何在兩個類之間進行選擇,因此它會自爆)。我聽說在Java 8中您現在可以再次遇到該問題:)
JAVA支持動態調度 ,不過就是“ 運行時聚合 ”。
代碼中的異常原因:
可能的解決方案:
您可以使用以下解決方案之一,也可以同時使用這兩種解決方案。
像這樣初始化“ foo ” String foo = new String();
進行NULL檢查
if(foo!=null) { if(foo.equals("Constant")) { System.out.println("TRUE"); } } else { System.out.println("NULL"); }
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.