簡體   English   中英

為什么在創建Map時會出現IllegalArgumentException?

[英]Why am I getting an IllegalArgumentException when creating a Map?

我正在嘗試創建一個城市和溫度的地圖,但它正在拋出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.

為什么會這樣? 內容應該是不一樣的嗎?

為什么會這樣?

因為您的實例化中有一個重復的鍵: "London" MapSet不可變靜態工廠不允許重復(如果映射條目的鍵是重復的,則映射條目是重復的) - 不是在創建期間 - 因此根本不是。 拋出的IllegalArgumentException表明了這種限制。

雖然從技術上講你沒有做任何不兼容的事情,但是圖書館的作者認為這是一個(可能是復制粘貼)的錯誤。 為什么要添加一個項目只是為了稍后覆蓋幾行?

這讓我想到......

如果我逐個添加它們就沒問題了

這就是你的想法,只有你可能沒有意識到你的地圖將包含少於你輸入的1個條目。 重復條目會覆蓋前一個條目(“最后一個勝利”規則)。 當因此發生錯誤時,會出現很多問號。 出於這個原因, 快速失敗的方法有其優點(雖然我不會提倡它只是更好)。

作為提示,在創建地圖時,如果您將其格式化,則更容易看到其內容:

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.of()中所述

他們在創建時拒絕重復的密鑰。 傳遞給靜態工廠方法的重復鍵導致IllegalArgumentException

因為,每個奇數參數是鍵,偶數是Map值。 您需要確保odd-number參數是唯一的。

另一方面, Map.put將替換相同鍵的舊值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM