RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 871121
Accepted
Suvitruf - Andrei Apanasik
Suvitruf - Andrei Apanasik
Asked:2020-08-21 01:48:09 +0000 UTC2020-08-21 01:48:09 +0000 UTC 2020-08-21 01:48:09 +0000 UTC

什么是空?

  • 772
  1. null它是某事的一个例子吗?
  2. 它属于什么类型null?
  3. 是什么null?
  4. 它在记忆中是如何表现的?

对“Java 中什么是 null?”这个问题的松散翻译。来自@unj2。

java
  • 1 1 个回答
  • 10 Views

1 个回答

  • Voted
  1. Best Answer
    Suvitruf - Andrei Apanasik
    2020-08-21T01:48:15Z2020-08-21T01:48:15Z

    null它是某事的一个例子吗?

    没有与 匹配instanceof的类型null。

    15.20.2 类型比较运算符instanceof

    RelationalExpression:
      RelationalExpression instanceof ReferenceType
    

    在运行时,运算符的结果instanceof是true如果RelationalExpression的值不是null,并且可以将引用强制转换为ReferenceType而不会出现异常ClassCastException。否则,结果将是false。

    这意味着对于任何类型E,R对于任何E o地方o == null,o instanceof R总会有false.

    它属于什么类型null?

    JLS 4.1 类型和值的种类。

    还有一种特殊类型nullnull ,一种没有名称的表达式类型。而且因为 null类型没有名称,无法声明null变量或将变量强制转换为null。 null参考 - 唯一可能的值是null类型的表达式 。null始终可以转换为任何引用类型。实际上,您可以忽略null类型,并假装 null它只是一个可以是任何引用类型的特殊文字。

    是什么null?

    正如上面 JLS 的引用所述,“null只是一个可以是任何引用类型的特殊文字”。

    在 Javanull == null中(并非所有语言都如此)。从描述java.lang.Object:

    public boolean equals(Object obj)

    对于任何非null变量x,x.equals(null)必须返回false。

    null也是所有引用类型的默认值。

    JLS 4.12.5 变量的初始值:

    • 静态类变量、实例变量和数组在创建时使用默认值进行初始化: * 对于所有引用类型(第 4.3 节),默认值为null.

    您可以将此属性用于延迟初始化,在实际使用之前,该字段将具有初始值null,其中它将被替换为“真实”值(计算起来可能很昂贵)。

    还有其他用途。如果你看java.lang.System:

    public static Console console()

    返回: 系统控制台(如果有),否则为 null。

    这是一种很常见的做法:null用来指代一个不存在的对象。

    另一个例子是java.io.BufferedReader:

    public String readLine() throws IOException

    返回: 包含行内容的字符串,不包括任何行终止字符,如果已到达流的末尾,则返回 null。

    readLine()将返回instanceof String每一行,直到它得到null一个,表示结束。这使得每一行都可以这样处理:

    String line;
    while ((line = reader.readLine()) != null) {
       process(line);
    }
    

    注意:空字符串不是问题,因为 "" != null.

    让我们考虑一下java.util.Map<K,V>:

    V get(Object key)

    返回指定键映射到的值,或者null如果此映射不包含该键的映射。

    如果此映射允许null值,则返回值null不一定表示映射不包含键的映射;地图也有可能将键显式映射到null. 该containsKey操作可用于区分这两种情况。

    在这里,我们看到使用null会使事情复杂化。它在这里说,如果没有这样的密钥,null. 第二个语句说即使有一个元素具有这样的键,它仍然可以返回null。

    例如,java.util.Hashtable通过禁用null键和值使事情变得更容易;所以,如果它V get(Object key)返回,null它清楚地表明这样一个键下没有任何东西。

    不会抛出自动null拆箱操作java.lang.NullPointerException:

    Integer i = null;
         
    // при анбоксинге null в integer будет выброшен NullPointerException 
    int a = i;
    

    总而言之,它null被用作特殊含义来表示:

    • 未初始化状态。
    • 终端条件
    • 不存在的物体。
    • 未知值。

    null它在记忆中是如何表现的?

    从JVM 规范:

    Java 虚拟机规范不强制要求具体的值编码null。

    小加法

    CAR Hoare的一句有趣的话:

    我称之为我的十亿美元错误。这是 null1965 年引用的发明。当时,我正在为面向对象语言 ( ALGOL W ) 中的引用设计第一个综合类型系统。我的目标是确保所有引用的使用都应该是绝对安全的,并由编译器自动执行检查。但我无法抗拒提供null参考的诱惑,仅仅是因为它很容易实现。这导致了无数的错误、漏洞和系统崩溃,在过去的四十年中可能造成了十亿美元的痛苦和损失。

    您还可以观看有关十亿美元错误的演示。

    在形成答案时,要回答“Java 中什么是 null?”这个问题。来自贡献者@polygenelubricants。

    • 54

相关问题

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    是否可以在 C++ 中继承类 <---> 结构?

    • 2 个回答
  • Marko Smith

    这种神经网络架构适合文本分类吗?

    • 1 个回答
  • Marko Smith

    为什么分配的工作方式不同?

    • 3 个回答
  • Marko Smith

    控制台中的光标坐标

    • 1 个回答
  • Marko Smith

    如何在 C++ 中删除类的实例?

    • 4 个回答
  • Marko Smith

    点是否属于线段的问题

    • 2 个回答
  • Marko Smith

    json结构错误

    • 1 个回答
  • Marko Smith

    ServiceWorker 中的“获取”事件

    • 1 个回答
  • Marko Smith

    c ++控制台应用程序exe文件[重复]

    • 1 个回答
  • Marko Smith

    按多列从sql表中选择

    • 1 个回答
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Suvitruf - Andrei Apanasik 什么是空? 2020-08-21 01:48:09 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5