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 泛型有助于理解可以在不定义变量数据类型的情况下定义和调用函数。可以在代码中的任何位置引用正确的数据类型而不会出现错误。