簡體   English   中英

Java相等性檢查和調度算法

[英]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不會被調用。

  1. Java不是單一的調度語言。 它具有多重調度機制,也就是方法重載。
  2. 沒錯,對於示例代碼,分派沒有任何作用。

您所讀的只是關於每個對象都是Object.class的擴展。 實際上,這意味着從Object.class到Custom.class的最新實現擴展Object.class只能做一個層次結構。

但是null不是Object。

這意味着您不能在null上使用Dispatch機制,當它找到null引用時,它將引發NullPointerException。

這與Java無關,僅與分派機制的工作方式(多種或單一類型)無關

ps:在某些語言中,您可以創建從多個超類擴展的類。 Java不會這樣做是為了避免出現鑽石問題(您從方法名稱相同的2個類擴展而來。編譯器看起來它們做了不同的事情,並且不知道如何在兩個類之間進行選擇,因此它會自爆)。我聽說在Java 8中您現在可以再次遇到該問題:)

JAVA支持動態調度 ,不過就是“ 運行時聚合 ”。

代碼中的異常原因:

  • 正如其他人指出的那樣,第一個代碼不起作用,因為您正在對“ NULL”調用“ equals”方法
  • 您必須像下面這樣聲明“ foo”: String foo = null ;
  • 請參見此處,“ foo ”是引用類型為“ String ”的變量,但它引用的是“ null”而不是“ String”對象。 但是,由於“ foo ”是一個字符串類型的編譯器,因此您可以在其上調用“ equals ”方法。 它沒有給出編譯時錯誤
  • 但是,當您運行代碼並且如果“ foo ”仍然為NULL時,JVM將嘗試在空對象上調用“ equals ”。 因此它吐出“ NULL POINTER EXCEPTION

可能的解決方案:

您可以使用以下解決方案之一,也可以同時使用這兩種解決方案。

  • 像這樣初始化“ fooString 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.

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