”工欲善其事,必先利其器。“—孔子《论语.录灵公》
首页 > 编程 > 为什么三元运算符允许 int 返回 Null,而 if 语句不允许?

为什么三元运算符允许 int 返回 Null,而 if 语句不允许?

发布于2024-11-13
浏览:239

Why Does the Ternary Operator Allow Null Return for int While an if Statement Doesn't?

三元运算符与 if 语句返回 null int

在 Java 中,三元运算符 (?:) 允许赋值null 到 int 类型的变量,即使 int 是不支持 null 值的原始数据类型。考虑以下代码片段:

int temp() {
    return true ? null : 0;
}

在此代码中,如果计算条件为 true,则三元运算符将 null 分配给变量 temp,否则分配 0。编译器允许此分配而不会发出任何错误。然而,当该方法执行时,它会在运行时抛出 NullPointerException,因为 null 不是 int 的有效值。

与三元运算符相反,if 语句不允许对以下变量进行此类 null 赋值原始类型。例如:

int same() {
    if (true) {
        return null;
    } else {
        return 0;
    }
}

此代码将生成编译时错误,并显示消息“不兼容的类型:null 无法转换为 int”。造成这种差异的原因在于编译器处理 null 值的方式。

在三元运算符的情况下,编译器将 null 文字解释为对 Integer(int 的包装类)的 null 引用。这是由于自动装箱和拆箱的编译器规则所致:当从基本类型转换为对象类型时,Java 虚拟机 (JVM) 会自动将基本值包装在相应的对象包装器中。

由于 int 是一个原始类型,编译器会尝试对三元运算符返回的 null 值进行拆箱,这会导致 NullPointerException。

另一方面,if 语句不会执行此拆箱过程,并且 null 文字仍然存在作为对象的空引用。由于same()方法的返回类型是int,编译器无法将空引用转换为int,因此会出现编译时错误。

最新教程 更多>
  • 除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    除了“if”语句之外:还有什么地方可以在不进行强制转换的情况下使用具有显式“bool”转换的类型?
    无需强制转换即可上下文转换为 bool您的类定义了对 bool 的显式转换,使您能够在条件语句中直接使用其实例“t”。然而,这种显式转换提出了一个问题:“t”在哪里可以在不进行强制转换的情况下用作 bool?上下文转换场景C 标准指定了四种值可以根据上下文转换为 bool 的主要场景:语句:if、w...
    编程 发布于2024-11-20
  • 如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    如何修复 macOS 上 Django 中的“配置不正确:加载 MySQLdb 模块时出错”?
    MySQL配置不正确:相对路径的问题在Django中运行python manage.py runserver时,可能会遇到以下错误:ImproperlyConfigured: Error loading MySQLdb module: dlopen(/Library/Python/2.7/site-...
    编程 发布于2024-11-20
  • 如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 查找今天生日的用户?
    如何使用 MySQL 识别今天生日的用户使用 MySQL 确定今天是否是用户的生日涉及查找生日匹配的所有行今天的日期。这可以通过一个简单的 MySQL 查询来实现,该查询将存储为 UNIX 时间戳的生日与今天的日期进行比较。以下 SQL 查询将获取今天有生日的所有用户: FROM USERS ...
    编程 发布于2024-11-20
  • 如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    如何在 PHP 中组合两个关联数组,同时保留唯一 ID 并处理重复名称?
    在 PHP 中组合关联数组在 PHP 中,将两个关联数组组合成一个数组是一项常见任务。考虑以下请求:问题描述:提供的代码定义了两个关联数组,$array1 和 $array2。目标是创建一个新数组 $array3,它合并两个数组中的所有键值对。 此外,提供的数组具有唯一的 ID,而名称可能重合。要求...
    编程 发布于2024-11-20
  • 为什么 Goroutine 在 Windows 上有时会执行失败?
    为什么 Goroutine 在 Windows 上有时会执行失败?
    理解 Windows 上非功能性 Goroutines 之谜在并发领域,Goroutines 在 Go 中充当轻量级线程。然而,一些程序员遇到了意想不到的挑战:goroutines 无法在 Windows 上执行。为了解开这个谜团,让我们深入研究一下根本问题。根本原因:异步执行与传统线程不同,gor...
    编程 发布于2024-11-20
  • 大批
    大批
    方法是可以在对象上调用的 fns 数组是对象,因此它们在 JS 中也有方法。 slice(begin):将数组的一部分提取到新数组中,而不改变原始数组。 let arr = ['a','b','c','d','e']; // Usecase: Extract till index p...
    编程 发布于2024-11-20
  • Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta 中的列偏移发生了什么?
    Bootstrap 4 Beta:列偏移的删除和恢复Bootstrap 4 在其 Beta 1 版本中引入了重大更改柱子偏移了。然而,随着 Beta 2 的后续发布,这些变化已经逆转。从 offset-md-* 到 ml-auto在 Bootstrap 4 Beta 1 中, offset-md-*...
    编程 发布于2024-11-19
  • 尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    尽管代码有效,为什么 POST 请求无法捕获 PHP 中的输入?
    解决 PHP 中的 POST 请求故障在提供的代码片段中:action=''而不是:action="<?php echo $_SERVER['PHP_SELF'];?>";?>"检查 $_POST数组:表单提交后使用 var_dump 检查 $_POST 数...
    编程 发布于2024-11-19
  • 如何使用 PHP 高效地将大型 MySQL 文件导入共享主机?
    如何使用 PHP 高效地将大型 MySQL 文件导入共享主机?
    PHP 中高效的 MySQL 文件导入:共享主机的拆分查询在 Web 开发领域,通常需要在使用共享主机提供商时导入大型数据库文件出现。不幸的是,通过命令行访问 MySQL 可能会受到限制,因此需要一个基于 PHP 的解决方案来解析和执行查询。为了解决这一挑战,开发了一个名为 SplitSQL() 的...
    编程 发布于2024-11-19
  • 可以仅使用 CSS 将图像大小调整为其大小的百分比吗?
    可以仅使用 CSS 将图像大小调整为其大小的百分比吗?
    仅使用 CSS 将图像大小调整为自身的百分比在网页设计领域,需要将图像大小调整为特定尺寸经常出现。一种场景涉及将图像的大小减小到其原始大小的一定百分比,而不改变其容器元素的大小。虽然 JavaScript 或服务器端脚本提供了解决方案,但本文探讨了潜在的纯 CSS 替代方案。是否可以使用 CSS 百...
    编程 发布于2024-11-19
  • 何时为 JavaScript 继承选择 Object.create 而不是 new?
    何时为 JavaScript 继承选择 Object.create 而不是 new?
    JavaScript 继承:Object.create 与 newJavaScript 中的继承概念可能会令人困惑,因为有多种实现方法它。本文旨在阐明最受接受的方法,并为您的特定场景提供解决方案。理解 Object.create 和 newObject.create 是一个创建对象的方法通过从现有对...
    编程 发布于2024-11-19
  • Bootstrap 网格类(如 col-md-4、col-xs-1 和 col-lg-2)中的数字如何确定元素宽度和响应能力?
    Bootstrap 网格类(如 col-md-4、col-xs-1 和 col-lg-2)中的数字如何确定元素宽度和响应能力?
    理解 Bootstrap 网格类中的数字:col-md-4、col-xs-1、col-lg-2The Bootstrap 框架引入了强大的网格系统,有助于创建响应式布局。该系统的组成部分是具有 col-* 格式的类,其中星号代表数字。这些数字在确定网格内的元素如何对齐以及它们如何响应不同的屏幕尺寸方...
    编程 发布于2024-11-19
  • 如何确定 C++ 编译器是否符合 IEEE 754 浮点标准?
    如何确定 C++ 编译器是否符合 IEEE 754 浮点标准?
    检查 C 中的 IEEE 754 浮点标准 确定 C 编译器是否遵循 IEEE 754 浮点标准通常通过以下方式完成编译器定义。然而,用于 C 的技术可能并不直接适用于 C 。C 特定方法幸运的是,C 提供了一种简单的方法来使用 numeric_limits 完成此检查class:std::nume...
    编程 发布于2024-11-19
  • 如何使用 SHA-256 在 Java 中实现安全字符串哈希?
    如何使用 SHA-256 在 Java 中实现安全字符串哈希?
    使用 SHA-256 的 Java 哈希字符串在 Java 中使用 SHA-256 哈希字符串可能看起来是一个简单的任务,但是有散列和编码之间的关键区别需要澄清。SHA-256(安全散列算法-256)是不是编码机制;它是一种单向哈希函数。这意味着当您对字符串进行哈希处理时,您会生成不可逆的二进制数据...
    编程 发布于2024-11-19
  • 如何使用 CSS 替换已弃用的 HTML5 表格属性?
    如何使用 CSS 替换已弃用的 HTML5 表格属性?
    HTML5 表格属性:弃用和 CSS 替换HTML5 中已弃用一些常用来设置 HTML 表格样式的属性,包括 cellpadding 、单元格间距、valign 和对齐。进行此更改是为了实现 Web 开发现代化并促进更严格地遵守 HTML5 标准。在 Visual Studio 中,您可能会收到警告...
    编程 发布于2024-11-19

免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。

Copyright© 2022 湘ICP备2022001581号-3