当前位置: 首页 > 面试题库 >

Boolean.valueOf()有时会产生NullPointerException

颛孙飞
2023-03-14
问题内容

我有这个代码:

package tests;

import java.util.Hashtable;

public class Tests {

    public static void main(String[] args) {

        Hashtable<String, Boolean> modifiedItems = new Hashtable<String, Boolean>();

        System.out.println("TEST 1");
        System.out.println(modifiedItems.get("item1")); // Prints null
        System.out.println("TEST 2");
        System.out.println(modifiedItems.get("item1") == null); // Prints true
        System.out.println("TEST 3");
        System.out.println(Boolean.valueOf(null)); // Prints false
        System.out.println("TEST 4");
        System.out.println(Boolean.valueOf(modifiedItems.get("item1"))); // Produces NullPointerException
        System.out.println("FINISHED!"); // Never executed
    }
}

我的问题是我不明白为什么 Test 3 可以正常工作(它打印false并且不产生NullPointerException),而 Test
4却
抛出了NullPointerException。正如你可以看到测试 12
nullmodifiedItems.get("item1")是平等的和null

Java 7和8中的行为相同。


问题答案:

您必须仔细查看正在调用的重载:

  • Boolean.valueOf(null)正在调用Boolean.valueOf(String)NPE即使提供了null参数,也不会抛出“ even”。
  • Boolean.valueOf(modifiedItems.get("item1"))正在调用Boolean.valueOf(boolean),因为modifiedItems的值类型为Boolean,需要进行拆箱转换。既然modifiedItems.get("item1")null,那就是该值的拆箱-而不是Boolean.valueOf(...)-引发NPE。

确定调用哪个重载的规则非常繁琐,但它们大致如下:

  • 在第一遍中,搜索方法匹配项而不允许装箱/拆箱(也不使用可变Arity方法)。

    • 因为null是一个可接受的值String而不是boolean,在此过程中Boolean.valueOf(null)匹配Boolean.valueOf(String)
    • BooleanBoolean.valueOf(String)或都不可接受的Boolean.valueOf(boolean),因此在此传递中没有方法匹配Boolean.valueOf(modifiedItems.get("item1"))
    • 在第二遍中,搜索方法匹配项,以允许装箱/拆箱(但仍然不是可变arity方法)。

    • Boolean可以将A 拆箱boolean,因此在此过程中Boolean.valueOf(boolean)与匹配Boolean.valueOf(modifiedItems.get("item1"));但是编译器必须插入拆箱转换才能调用它:Boolean.valueOf(modifiedItems.get("item1").booleanValue())

    • (第三遍允许使用可变Arity方法,但此处不相关,因为前两个遍历与这些情况匹配)


 类似资料:
  • 我的服务等级代码如下: 我的测试课程如下: 在运行测试时,我在给出Mockito的那一行得到了NullPointerException。何时返回条件。我尝试了很多组合,但它仍然提供NPE。我甚至连方法调用都做不到。你能告诉我哪里出了问题吗?

  • 问题内容: 我正在尝试为使用情况统计信息生成报告。以下是我在数组中存储的示例数据,这是从Mysql表中获取的。如何实现一个逻辑,即如果用户闲置超过30分钟,没有使用过系统,否则计算使用时间的平均时间。 问题答案: 我想这就是你想要的。它遍历列表,计算每个条目与上一个条目之间的差异。如果差异大于或等于30分钟,它将忽略它。如果少于30分钟,则会将其添加到该用户的总使用量中。(我假设所有时间戳都是针对

  • 下面的错误会不时弹出,但并不总是在同一个地方。不太清楚为什么。有线索吗?这里的完整代码:完整代码 文件“/users/davidkasapchuk/pycharmprojects/test/homedepotfridges.py”,第257行,在price=item.find_element_by_class_name('product-display-price')文件“/library/fra

  • 问题内容: 在我用Swift编写的SpriteKit iOS游戏中,播放非常短的声音(约0.5秒)会产生打ic(如滞后)。在其他问题中,我读到我应该发出声音,就像以前那样。 我什至使用变量()在播放之前检查声音是否准备就绪。每当播放完()时,我也会重新准备声音。以下是代码的相关部分: 我不知道我在哪里犯了错误。我感觉我已经尝试了所有方法(包括但不限于:仅准备一次,在播放后立即准备,不使用变量,而只

  • 我必须在一个学校项目的“slice”对象上实现一个快速排序算法,该slice对象是一个具有: “数据”字段(要排序的整个数组) “左”和“右”字段(表示数组中切片子部分的索引) 分区函数代码如下: 该函数的doctests不会失败,但是当调用quicksort递归函数时,分区函数的行为不会像预期的那样。quicksort函数的代码如下: 编辑:正如下面的一条评论所指出的,我简直忘了更新piv的值,

  • 问题内容: 最近,我按照这篇文章的建议删除了项目中的所有scriptlet 。但是现在,如果我尝试更改其中一个视图,则会收到deferredExpression错误。为了摆脱错误,我只需要终止,然后重新启动项目即可。 这里发生了什么?eclipse是否无法即时编译jstl?有什么我可以更改的,所以我不必每次进行更改都重新部署吗? 堆栈跟踪 问题答案: java.lang.NoSuchFieldEr