【问题标题】:Ternary Operator with Map NullPointerException Java三元运算符与 Map NullPointerException Java
【发布时间】:2023-03-12 02:10:01
【问题描述】:

这里的疑问是,如果地图中的键不存在,它会返回 null,我试图在 Integer 中得到它。

import java.util.*;
class Main {
  public static void main(String[] args) {
    HashMap<String,Integer> hm =new HashMap<>();
    hm.put("abc",1);
    hm.put("xyz",1);
    System.out.println(hm.get("pqr"));
    Integer result = hm !=null ? hm.get("pqr") : 0;
    System.out.println(result);
  }
}

输出:

null
Exception in thread "main" java.lang.NullPointerException
    at Main.main(Main.java:10)

如果我将三元运算符拆分为if-else 喜欢:

import java.util.*;
public class TestMain {
    public static void main(String[] args) {
        HashMap<String,Integer> hm =new HashMap<>();
        hm.put("abc",1);
        hm.put("xyz",1);
        System.out.println(hm.get("pqr"));
        Integer result;
        if ( hm != null){
          result = hm.get("pqr");
        } else
            result =0;
        System.out.println(result);
    }
}

输出:

null
null

三元运算符出了什么问题?

【问题讨论】:

    标签: java nullpointerexception hashmap integer conditional-operator


    【解决方案1】:

    三元条件表达式的类型

    hm !=null ? hm.get("pqr") : 0
    

    int,所以hm.get("pqr")(其值为null)被拆箱到int,这会抛出NullPointerException

    为了避免它,你可以写:

    Integer result = hm !=null ? hm.get("pqr") : Integer.valueOf(0);
    

    现在三元条件表达式的类型将是Integer,因此不会尝试拆箱hm.get("pqr"),也不例外。

    确定三元条件运算符类型的逻辑可以在Table 15.25-ATable 15.25-C中的15.25. Conditional Operator ? :中找到。

    【讨论】:

    • 唉,如果只有 Java 也使用 = 的左侧推断表达式的类型...
    • @Sweeper 我怀疑这样做会将语法解析放入不同的难度等级。
    • @Eran 您说“hm.get("pqr") (其值为 null)被拆箱为抛出 NullPointerException 的 int”,为了避免,您仍然忽略“hm.get(” pqr") (其值为空)" 而是将 0 包装到 Integer 中,它本身已经是一个整数。你所做的可能不是答案,而正是你在他的代码中重复了同样的事情。此外,它的 Integer 可以取 null,因为它不是原始类型!所以我什至对他得到 NullPointerEception 感到惊讶,如果你检查第二个代码,你就会明白为什么他不应该得到异常。
    • @Whales_Corps 您是否尝试运行 OP 的代码和我建议的更正,然后再确定它是错误的?如果你这样做了,你会得到 OP 代码的异常,并且在使用我的建议时会避免异常。 hm.get("pqr") 的值是 Integer (因为 Map 的值的类型),所以如果我确保三元条件运算符的第三个操作数的类型也是 Integer (通过使用 @987654337 @,表达式的类型为Integer。当第二个操作数为Integer,第三个为int时,表达式的类型为int
    • 是的,我确实运行了代码,但没有收到任何异常!也许Java版本很重要?但我确信您可以将空值分配给非原始数据类型,因为它们基本上是一个对象,因此一个对象可以为空!在我最终运行它并且没有得到它之后,得到 NullPointer Exception 对我来说仍然很神秘!这就是我的观点。如果您愿意,我们可以通过样品进一步讨论。另外,如果我听起来很粗鲁,请道歉。但请注意,您重复了与问题作者相同的代码。
    【解决方案2】:

    HashMap 中没有键 pqr,所以hm.get("pqr") 返回null

    result = hm.get("pqr"); // result is null
    

    来自Docs

    返回:指定键映射到的值,如果是 null 此映射不包含键的映射

    【讨论】:

      【解决方案3】:

      Map中没有key pqr,所以hm.get("pqr")返回null值。如果你用object检查它会返回null。所以你可以把object改成key,它会得到成功值。

      public static void main(String[] args) {
              Map<String, Integer> hm = new HashMap<>();
              hm.put("abc", 1);
              hm.put("xyz", 1);
              System.out.println(hm.get("pqr"));    
              Integer result = hm.get("pqr") !=null ? hm.get("pqr") : 0;
              System.out.println(result);
          }
      

      输出: 无效的, 0

      谢谢,

      【讨论】:

        【解决方案4】:

        如果地图中的键不存在,则返回 null。您将根据密钥进一步验证。

        Integer result = hm !=null ? ((hm.get("pqr") != null ? hm.get("pqr"): 0)):0;
        // result 0 or value
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-02-03
          • 2017-09-27
          • 2011-12-31
          • 2014-02-08
          • 2011-03-12
          相关资源
          最近更新 更多