根据文档,该方法String.valueOf(Object obj)
返回:
如果参数是null
,则字符串等于"null"
; 否则,obj.toString()
返回的值。
但是,当我尝试这样做时,怎么会这样:
System.out.println("String.valueOf(null) = " + String.valueOf(null));
它会抛出NPE吗?(如果你不相信,请自己尝试!)
Exception in thread "main" java.lang.NullPointerException
at java.lang.String.(Unknown Source)
at java.lang.String.valueOf(Unknown Source)
怎么会这样呢?文件在骗我吗?这是Java中的主要错误吗?
问题是String.valueOf
方法已重载:
Java规范语言要求在这种情况下,选择最具体的重载:
JLS 15.12.2.5选择最具体的方法
如果可以访问多个成员方法并将其应用于方法调用,则必须选择一个成员方法来为运行时方法分派提供描述符。Java编程语言使用选择最特定方法的规则。
一个char[]
是- Object
但不是全部Object 是-一个 char[]
。因此,char[]
它比特定于Object
,并且按照Java语言的规定,String.valueOf(char[])
在这种情况下选择重载。
String.valueOf(char[])
期望数组为非数组null
,并且由于null
在这种情况下给出了数组,所以它抛出了NullPointerException
。
简单的“修复”是将null显式强制转换Objec
t为以下形式:
System.out.println(String.valueOf((Object) null));
// prints "null"
我有一段类似这样的代码: 我的测试是: 上面的代码不应该抛出NPE吗? 当我将测试更改为: 然后我的代码正确地抛出了一个空指针异常。 我的测试第一版和第二版有什么区别? 在我的第一个版本中,我告诉mockA返回mockB。但是我也将mockB设置为null,所以当调用b.doSomething()时,我认为该方法应该抛出一个空指针,因为它试图调用null.doSomething()。 我知道我应该
问题内容: 运行此命令时: 响应为: 这对我来说真是太棒了。我本以为这会带来编译时错误。 为什么我可以在Java中抛出null,为什么将其转换为NullPointerException? (实际上,鉴于我抛出的是null,因此我不知道这是否是“ upcast”) 除了一个非常愚蠢的面试问题(请没人在面试中问这个问题)之外,我看不到任何理由。也许您想被解雇,但这就是…我的意思是,为什么还会有人呢?
我有一个想要减少的枚举值流。如果流为空或包含不同的值,我希望。如果它只包含一个值(的多个实例),我想要那个值。 我试着用减音来做: 不幸的是,这不起作用,因为当结果为时,这个reduce方法抛出一个。有人知道为什么会这样吗?为什么不是有效的结果? 现在,我是这样解决的: 在这起作用的同时,我并不满足于这种“弯路”。我喜欢减少,因为它似乎是合适的,把所有的东西都放进一个流。 有没有人能想出一个替代r
问题内容: final Multimap terms = getTerms(bq); for (Term t : terms.keySet()) { Collection C = new HashSet(terms.get(t)); if (!C.isEmpty()) { for (Iterator it = C.iterator(); it.hasNext();) { BooleanClause
问题内容: 我试图将两个’Employee’对象添加到TreeSet中: 但是它抛出一个ClassCastException: 但是,如果我仅将一个对象添加到TreeSet中: 或者,如果我改用HashSet: 那就成功了。为什么会发生异常,我该如何解决? 问题答案: 要么必须实现,或者你需要提供一个比较创建时。 在文档中对此进行了详细说明: 插入排序集中的所有元素都必须实现接口(或被指定的比较器
问题内容: 将字符串解析为字节时出现异常 问题答案: 这是因为默认的parse方法要求使用十进制格式的数字来解析十六进制数字,请使用以下parse: 其中16是解析的基础。 至于您的评论,您是对的。字节的最大值为0x7F。因此,您可以将其解析为并执行二进制与操作以获得LSB,即您的字节: