【问题标题】:Why am I getting an IllegalArgumentException when creating a Map?为什么我在创建地图时收到 IllegalArgumentException?
【发布时间】:2017-10-07 12:40:49
【问题描述】:

我正在尝试创建城市和温度地图,但它正在抛出 IllegalArgumentException。这是我正在做的事情:

Map<String, Integer> tempMap = Map.of("London", 13, "Paris", 17, "Amsterdam", 13, 
                                      "Madrid", 21, "Rome", 19, "London", 13, "Bonn", 14,
                                      "Moscow", 7, "Barcelona", 20, "Berlin", 15);

如果我一一添加就没有问题了:

Map<String, Integer> tempMap = new Hashmap<>(); // or LinkedHashMap
tempMap.put("London", 13);
tempMap.put("Madrid", 21);
tempMap.put("Moscow", 7);
// etc.

为什么会这样?内容不应该一样吗?

【问题讨论】:

  • 你是在回答第三个人的问题吗? :)
  • 异常的消息中不是描述了原因吗? (更不用说 Javadoc 了?)
  • 链接的元问题的顶部和接受的答案说“缺乏研究努力不是,也从来不是关闭问题的理由。然而,这是一个人们可能认为合适的理由否决一个问题。”这意味着提出这样的问题并不,这不是关闭它们的理由......
  • @Chris 抱歉,它在comment 中。事实是它一个坏问题。它很懒惰,文档清楚地回答了它。我只是问它,因为有人告诉我这些问题很好。我是抱怨List 问题并首先引起轻微争议的人。我也觉得很遗憾,答案是我的第三高票,而它几乎没有用。我想现在如果有人读到这条评论,他们会做出讽刺性的反对。
  • 哦,一个元元问题……

标签: java collections java-9


【解决方案1】:

为什么会这样?

因为您的实例化中有一个重复的键:"London"。用于MapSetimmutable static factories 不允许重复(如果其键是重复的,则映射条目是重复的) - 不在创建期间 - 因此根本不允许。限制通过抛出的IllegalArgumentException 来体现。

虽然从技术上讲你没有做任何不兼容的事情,但图书馆的作者认为这是一个(可能是复制粘贴)错误。为什么要添加一个项目只是为了在几行之后覆盖它?

这让我...

如果我一个一个添加就没有问题

这就是您的想法,只是您可能没有意识到您的地图包含的条目比您放入的少 1 个条目。重复的条目会覆盖前一个条目(“最后一个获胜”规则)。当一个错误因此发生时,会有很多问号。出于这个原因,fail-fast 方法有它的优势(虽然我不提倡它只是更好)。

作为提示,在创建地图时,如果稍微格式化一下,会更容易看到其内容:

Map<String, Integer> tempMap = Map.of(
        "London",    13,
        "Paris",     17,
        "Amsterdam", 13,
        "Madrid",    21,
        "Rome",      19,
        "London",    13, // !
        "Bonn",      14,
        "Moscow",     7,
        "Barcelona", 20,
        "Berlin",    15
);

【讨论】:

    【解决方案2】:

    Map.of()

    中所述

    他们在创建时拒绝重复的密钥。重复的键传递给 静态工厂方法导致IllegalArgumentException

    因为,每个奇数参数是键,偶数是 Map 的值。您需要确保奇数参数是唯一的。

    另一方面,Map.put 将替换相同键的旧值。

    【讨论】:

      猜你喜欢
      • 2021-11-02
      • 1970-01-01
      • 1970-01-01
      • 2021-02-17
      • 1970-01-01
      • 2013-07-03
      • 2015-11-02
      • 2021-05-24
      • 1970-01-01
      相关资源
      最近更新 更多