Java 中的未定義值 undefined

Jay Shaw 2023年10月12日
  1. 什麼是 Java 中的 undefined
  2. Java 中的 Null 是什麼
  3. 在 Java 中為變數分配空值的程式碼
  4. Java 中 Undefined 和 Null 的區別
  5. 在 Java 中使用空值的程式碼
  6. Java 中的空異常錯誤是什麼
  7. Java 泛型中未定義
  8. まとめ
Java 中的未定義值 undefined

本文旨在重點介紹未定義和空物件等資料型別。在本文的下一部分,重點將放在理解 Java 泛型中的 undefined 和 Java 中的 null 以及它們各自的程式碼和函式。

什麼是 Java 中的 undefined

未定義是沒有定義資料型別或已定義但尚未使用的空變數的一種形式。

注意

術語未定義有兩個含義。

  1. undefined 是 JavaScript 中的一種資料型別,與 Java 中的 null 有許多相似之處。在 Java 中,不存在術語 undefined
  2. 在很多情況下,未知物件也被標識為未定義。

這兩個方面將在本文後面討論。

讓我們首先學習如何初始化未定義的變數,然後檢查它是否是未定義的資料型別。

  1. 建立一個名為 a 的靜態變數的類 check_null
  2. 可以看出變數 a 沒有定義任何資料型別,所以 if-else 條件丟擲第一個條件並列印:Resultant is a null

這解釋了預設情況下,變數旨在在未完成資料型別宣告時獲得分配的空值。

public class check_null {
  static check_null a;
  public static void main(String args[]) throws Exception {
    if (a == null) {
      System.out.println("Resultant is a null");
    } else {
      System.out.println("Resultant is not a null");
    }
  }
}

輸出:

Resultant is a null

許多程式設計師對 undefined 和 null 感到困惑。儘管它們是非常不同的資料項,但它們的用途非常相似,因此我們必須瞭解 null。

Java 中的 Null 是什麼

Null 代表值的缺失,這意味著程式設計師故意將這種缺失放入變數中以達到目的。它接受 null 作為值,這意味著它不儲存任何其他值。

對於原始操作,編譯器為其分配零以避免編譯錯誤。

在 Java 中為變數分配空值的程式碼

  1. 建立一個名為 assign_null 的類。

  2. 在 main 方法中,初始化了兩個字串變數:str_s1str_s2。在這裡,第二個變數的初始化是可選的,單個變數也可以完成這項工作。

  3. null 儲存在變數 str_s1 中並傳遞給 str_s2。當兩個變數都被列印時,結果輸出都是空的。

    儘管它可能表示沒有值,但 Java 在操作期間將 null 視為值。

public class assign_null {
  public static void main(String[] arg) {
    String str_s1 = null;
    String str_s2 = str_s1;
    System.out.println(str_s1);
    System.out.println(str_s2);
  }
}

輸出:

null
null

Java 中 Undefined 和 Null 的區別

未定義是分配給那些使用哪種資料型別存在問題的變數的資料型別。它保留為佔位符,為資料型別提供追溯靈活性。

Null 是故意沒有分配給變數的值。在這種情況下找到的資料型別是未定義的,除了 null 之外,不能在此資料型別中插入其他值。

在現實生活中的示例中,null 可用於定義物件的空性。沒有頁面的印表機可以表示為空,如果有空白頁面則可以定義為空。

如果有列印頁面,則可以定義為非空。

在 Java 中使用空值的程式碼

在下面的程式中,將不同的值分配給 String 變數,並使用檢查方法檢查哪些值丟擲空值。

  1. 建立一個 FindifNull 方法,其目的是查詢我們傳遞的值是否與條件匹配。
  2. 檢查變數的內容,看它是空的、填充的還是空的。
  3. 然後,我們在主函式中輸入 3 個不同的字串,並呼叫我們的 FindifNull 方法將結果傳遞給主函式。
class useNull {
  public static void main(String[] args) {
    String er1 = null;
    String er2 = "";
    String er3 = "  ";

    System.out.println("\n"
        + "Resultant:" + FindifNull(er1));
    System.out.println("\nResultant:" + FindifNull(er2));
    System.out.println("\nResultant:" + FindifNull(er3));
  }
  public static String FindifNull(String str) {
    if (str == null) {
      return "Null";
    } else if (str.isEmpty()) {
      return "Not filled";
    } else {
      return "place filled";
    }
  }
}

輸出:

Resultant:Null

Resultant:Not filled

Resultant:place filled

Java 中的空異常錯誤是什麼

Null 為大多數程式語言中的物件提供了靈活性,因為它們可以在不提供引用型別的情況下定義。這些語言使用 null 作為預設值,以避免在引用時出錯。

但是,當多個物件想要引用到同一個資料儲存時,這可能會導致嚴重錯誤。

這可以通過 Java 中的函式過載來更好地理解。在這裡,兩個過載函式被定義為同名。

void test(Integer x)

    void test(String soap)

由於整數和字串都是原始資料型別,編譯器會感到困惑,無法識別在呼叫物件時應該將值傳遞給的變數。

main 類建立物件並將 null 傳遞給 test 方法。如果任一方法包含原始資料型別,則編譯器會將 null 傳遞給非原始資料型別。

下面的程式演示了方法過載時如何導致錯誤。

public class check {
  public void method(Integer x) {
    System.out.println("checking int");
  }
  public void method(String soap) {
    System.out.println("checking if string");
  }

  // Main class
  public static void main(String[] args) {
    check obj = new check();
    obj.method(null);
  }
}

輸出:

        obj.method(null);
           ^
  both method method(Integer) in check and method method(String) in check match
1 error

必須將空值顯式提供給具有非原始資料型別的變數才能解決此問題。這樣,編譯器可以被引導使用特定的方法。

下面的程式碼與上面的程式碼幾乎相似,主要功能略有變化。空值被傳遞給字串變數 mv,並建立物件 obj

最後,使用變數 mv 將該物件傳遞給方法 test。此變數有助於編譯器在其中找到正確的引用資料型別。

public class findthenull {
  public void test(Integer x) {
    System.out.println("test(Integer )");
  }
  public void test(String str) {
    System.out.println("test(String )");
  }
  // Main class
  public static void main(String[] args) {
    String mv = null;
    findthenull obj = new findthenull();
    obj.test(mv);
  }
}

輸出:

test(String )

Java 泛型中未定義

如文章開頭所述,未定義表示未定義的資料型別。Java 泛型將在下面的示例中使用,因為它們可用於定義物件而無需宣告其資料型別。

建立 Java 泛型是為了為引數化方法提供安全性。它有助於製作可以放置看門人的類,使其引數化。

雖然泛型方法與普通方法一樣,但主要區別在於 - 泛型方法是引數化的。普通函式接受任何資料型別值,但在資料型別不相容的情況下,程式會在執行時丟擲錯誤或崩潰。

可以使用泛型將引數放入方法中,以便該方法僅接受特定資料型別的值,而在編譯期間丟棄其他資料型別的值。

這為程式設計師解決型別轉換問題和資料型別不相容問題提供了更大的靈活性。

讓我們瞭解如何使用泛型。

  1. genrics 類在下面的程式碼中定義。
  2. 方法 check 是引數化的,有一個物件 T。這個物件 T 是一個未定義的型別;因此,它的資料型別也是未定義的,我們使用變數 data 來傳遞引數。
  3. 該方法檢查使用 instanceof 語法傳遞的值的資料型別。如果傳遞的值與資料型別匹配,我們將列印該值以說明其資料型別。
  4. 對於不相容的資料型別,我們使用了 if-else 方法來丟棄它們。
public class genrics {
  static <T> void check(T data) {
    if (data instanceof String)
      System.out.println("\nDatatype String has:" + data);
    else if (data instanceof Integer)
      System.out.println("\nDatatype Integer has:" + data);
    else
      System.out.println("\nThe datatype used is unsupported:" + data.getClass());
  }
  public static void main(String[] args) {
    check("This is an example");
    check(15);
    check(5.0);
  }
}

輸出:

Datatype String has: This is an example

Datatype Integer has:15

The datatype used is unsupported: class java.lang.Double

まとめ

本文旨在消除與未定義資料型別和空物件相關的混淆。據觀察,Java 中不存在未定義的資料型別,而使用空物件來滿足該需求。

Java 泛型有助於理解可以在不定義變數資料型別的情況下定義和呼叫函式。可以在程式碼中的任何位置引用正確的資料型別而不會出現錯誤。