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

Java String.valueOf(null)引发NPE,但是Object a = null;String.valueOf(a)返回'null'

别子实
2023-03-14
问题内容

是否存在以下行为的逻辑语言设计类型的解释(Java 7和我怀疑较早的版本):

    Object  a = null;
    String as = String.valueOf(a);              // as is assigned "null"
    System.out.println(as+":"+as.length());     // prints: "null:4"
    System.out.println ( String.valueOf(null)); // NPE

问题答案:

在statement中System.out.println(String.valueOf(null));有一个method的调用public static String valueOf(char data[]),其源代码如下:

public static String valueOf(char data[]) {
  return new String(data);
}

那就是为什么你得到 NPE

另一方面,在statement中Object a = null; String as = String.valueOf(a);有一个method的调用public static String valueOf(Object obj),其源代码如下:

public static String valueOf(Object obj) {
    return (obj == null) ? "null" : obj.toString();
}

这就是为什么您得到 “空” 而不是 NPE的原因

Java语言规范中的一些理论问题:15.12.2.5选择最具体的方法

如果多个成员方法既可访问又可应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。 Java编程语言使用选择 最具体 方法的规则。

A char[]是类型Object,但不是全部Object都是类型char[]。型char[]更具体的
比对象和作为Java语言规范所描述的,String.valueOf(char[])过载被选择在这种情况下。

编辑

还值得一提的是伊恩·罗伯茨([IanRoberts提到的内容(在下面的评论中):

这是需要注意的重要的是它的,如果没有一个统一的超载比所有其他更具体的编译错误-
如果有一个valueOf(String)方法,以及valueOf(Object)
valueOf(char[])随后的非类型化的调用String.valueOf(null) 是不明确



 类似资料:
  • 我有两个活动和两个布局。当我在第一个活动中显示列表时,一切都正常,并在单击时给出列表中项目的编号,但当我尝试在第二个活动中重复相同的内容时,它会告诉我RecycleServiceClickListener侦听器为空。 适配器: 第一项活动: 第二项活动: 错误: 我不明白为什么在第一种情况下,它正常处理单击,而在第二种情况下,它说RecyclerViewClickListener为null

  • 我使用Ehcache 2.6.8作为Spring Boot应用程序的一部分,作为Hibernate 4.3.11的二级缓存。我有一个JMX MBean,它允许我检查缓存的内容(如果您感兴趣,可以在这里查看)。 首先,我使用CacheManager名称来获取缓存列表。这很好。我可以用返回缓存。然后我调用。这很好,cacheName是“com.myapp.DomainObjectName”,键被列为“

  • 加载样式表,并在用户单击按钮时将其应用于场景 调用getScene()返回null。 函数所在的类是场景的控制器和根节点,我使用SceneBuilder 2.0,并将类设置为加载fxml的控制器,它是一个。 问题代码是类中的一个成员函数,标记是这样的,我可以通过设置按钮来调用它。 完整的代码可以在https://github.com/SebastianTroy/FactorioManufactur

  • 我试图打开一个文件进行解析(一个二进制文件),但是无论什么fopen()总是返回NULL。 我已经排除了几乎所有的东西,我有一个简单的测试脚本: trigger_error(var_export())的输出;是: 无论我为第二个fopen()选项指定什么标志,我都会得到相同的结果。 现在,明显的问题是该文件是否存在,以及我是否拥有读取该文件的权限?这两个问题的答案都是肯定的。我使用了相对路径和绝对

  • 在fetchplaces方法中,新的window.google.maps.places.PlacesService(map)总是返回null,并且Service.NearbySearch不会引发函数错误。 请帮忙。

  • DatePicker在更改日期之后没有更新。 另外,我尝试了在没有侦听器的情况下获取数据,比如: 也许有人有类似的问题,并找到了解决办法? 编辑1: