当前位置: 首页 > 知识库问答 >
问题:

为什么这段代码会给出空指针异常?我以为字符类可以处理null被赋值?[副本]

淳于涛
2023-03-14
public class Playground {
  public static void main(String[] args) {
    String s = "blah";
    Character lclfs = s.contains("/") ? '/' : s.contains("\\") ? '\\' : null;
  }
}

我遗漏了什么(使用Java1.8)?

共有1个答案

邹俊豪
2023-03-14

这是因为您的代码将尝试取消框null。使用IntelliJ,这将直接显示为警告:“取消null的装箱可能会产生NullPointerException”。

另一种选择是这样做:

String s = "blah";
Character lclfs = s.contains("/") ? Character.valueOf('/') : 
    s.contains("\\") ? Character.valueOf('\\') : null;

正如@Antoniossss指出的,这也会有所帮助:

String s = "blah";
Character lclfs = s.contains("/") ? Character.valueOf('/') : 
    s.contains("\\") ? (Character)'\\' : null;

谈到IntelliJ中的警告,上面的代码现在表示:“不必要的装箱'character.valueof('\')'”。所以也许你应该试着重构你的代码。您可以引入java.util.optional,而不是使用显式的null:

Optional<Character> lclfs = s.contains("/") ? Optional.of('/') :
        s.contains("\\") ? Optional.of('\\') : Optional.empty();
 类似资料:
  • 我们知道我们可以将null赋给可为null的类型。例如: 我们知道第二种说法是有效的,因为有人告诉我们它是有效的,我们只是接受它,而不问为什么。但如果查看的源代码,则为: 我们可以将赋给为的原因是由于隐式运算符,它允许您隐式强制转换int为。根据隐式运算符的规则,作为的右手边,必须是结构类型,但显然不是合法的结构值,那么如何做(更不用说本身就是一个结构),为什么不违反隐式运算符规则

  • 我有以下方法: 租户数据库服务。findTenantById(tenantId)返回可选的: 当为null时,我希望抛出异常。相反,我看到正在抛出: 有什么帮助吗?

  • 问题内容: 运行此命令时: 响应为: 这对我来说真是太棒了。我本以为这会带来编译时错误。 为什么我可以在Java中抛出null,为什么将其转换为NullPointerException? (实际上,鉴于我抛出的是null,因此我不知道这是否是“ upcast”) 除了一个非常愚蠢的面试问题(请没人在面试中问这个问题)之外,我看不到任何理由。也许您想被解雇,但这就是…我的意思是,为什么还会有人呢?

  • 我在代码中打开ListActivity时得到空指针异常,但所有跟踪都不是我的代码。

  • 我们最近在生产中遇到了一个我觉得非常有趣的错误。我长期以来的理解是Java布尔只能是false或true。然而,在三元运算符中,它似乎最终可以解析为null,而且它从未产生编译错误,并且一直构建到生产。我很惊讶下面的代码没有产生编译错误。有人知道为什么它编译得很好吗?恕我直言,它不应该编译!它最终解析的值是一个本机布尔值。

  • 我在写Fizz Buzz的时候遇到了一个意想不到的互动。如果我执行