2016-05-22 30 views
-1

有時在我的代碼中,我必須檢查某個變量是否等於一個常量字符串。例如:Java平等檢查和調度算法

if (foo.equals("CONST")) { 
    stuff.do(); 
} 

有時foo是null所以我得到一個空指針異常。一個解決辦法是簡單的交換對象和參數周圍像這樣:

if ("CONST".equals(foo)) { 
    stuff.do(); 
} 

我已閱讀,這是與Java作爲一個單一的調度語言做的,但我不明白爲什麼。如果foo爲空,您將調用空對象的方法,導致空指針異常。它與單一派遣(或多派遣,動態派遣等)有什麼關係?這個問題與任何調度概念有關嗎?

+1

你是不是調用一個空FOO的方法;你在一個String值爲「CONST」的非空實例上調用它。 equals方法的參數恰好爲null。 String的equals重載正確處理null參數。你讓它太複雜了 - 與派遣無關。 – duffymo

+0

我不確定我是否理解這個問題。你在哪裏讀到Java是一個單一的調度語言,而不是在第二個代碼段中拋出'NullPointerException'? – Tunaki

+0

@Tunaki對不起,我不確定這是很久以前。我最近又遇到了這個。 – Ogen

回答

1

在第一種情況下,您正在調用方法equals爲null導致問題,在第二種情況下,您要求的「CONST」不爲null,foo只是一個參數,並且不會調用equals爲了它。

1
  1. Java不是一種單一的調度語言。它具有多次調度 機制,又名方法重載。
  2. 你說得對,在exmaple代碼的情況下調度沒有效果。
+0

Wiki說Java是單一的發送語言:https://en.wikipedia.org/wiki/Multiple_dispatch#Java – Ogen

+0

我依靠這篇文章http://isagoksu.com/2009/single-dynamic-multiple-and-double -dispatching /將多派遣定義爲重載的同義詞。也許這是錯誤的? –

+0

該文章還說'順便說一句,Java不支持真正的多個調度,所以不要在創建重載方法時造成任何錯誤。「 – Ogen

0

你讀過的只是關於Object.class的每個擴展對象。 實際上,這意味着您只能從Object.class創建一個層級行,直到您的最新實現Custom.class擴展Object.class。

但是null不是Object。

這意味着您無法在空值上使用調度機制,並且在發現空引用時會拋出NullPointerException。

此無關,在特定的Java,只是調度機制是如何工作的(多個或單個類型)

PS:在某些語言中,你可以創建一個從多個超類擴展類。 Java並沒有這樣做,以避免鑽石問題(你從2個方法名稱相同的類擴展,編譯器看起來他們做了不同的事情,並不知道如何在兩個之間進行選擇,所以它在頭部自動拍攝),但我聽說在Java中8,你現在可以再次打的問題:)

0

JAVA支持動態調度這不過是「運行時間Polymerphism」。在你的代碼

原因的異常:

  • 正如所指出的其他第一碼不起作用,因爲你是 叫「等於」方法上的「NULL」
  • 你必須已經聲明如下「foo」:String foo = null;
  • 看到這裏「FOO」是引用類型「字符串」的變量,但它是指 爲「空」而不是「字符串」對象。但由於「foo」是一個字符串類型的編譯器,因此您可以通過它調用 「」等於「的方法。它不給編譯時錯誤
  • 但是,當您運行的代碼,如果「」仍然是NULL,JVM將 嘗試調用一個空對象「等於」。因此,它吐出「NULL 指針異常

可能的解決方案:

可以使用下面的解決方案之一或兩者。

  • 初始化 「FOO」 像這樣字符串富=新的String();

  • 做一個NULL檢查

     if(foo!=null) 
        { 
        if(foo.equals("Constant")) 
        { 
         System.out.println("TRUE"); 
        } 
        } 
        else 
        { 
         System.out.println("NULL"); 
        }