我遇到了一個非常不尋常的問題。
基本上,我試圖從字符串映射到字符串獲取與鍵相關聯的值。
我知道我使用的鑰匙是存在的;我使用的是我用來放入的同一個字符串!Java Map對於現有密鑰返回null
我一直都在我的代碼打印報表,這是情況下,我有...
這裏是我的字典characterDictionary
{thusChar=∴, spaceChar= , plusChar=+, equalsIndent=#, multiplyChar=×, equalsChar==, newlineChar=\n, divideChar=÷, subjectChar=:, [email protected]}
的最後關鍵「variableIndent」是麻煩!
下面的代碼...
System.out.println ( characterDictionary.get("variableIndent"));
不適當地輸出:null
我已經檢查,雙重檢查和三重檢查我的代碼。
關鍵「variableIndent」和字符串參數characterDictionary.get("variableIndent")
之間絕對沒有區別,但它的行爲就好像該鍵不存在一樣。
我可以絕對保證這個鍵是存在的,而且這兩個字符串是相同的。
正常檢索所有其他元素(我檢查過的元素;到目前爲止大約3個)。爲什麼「variableIndent」的值是「@」值?
您可能會注意到該字典包含非ASCII字符,如「thusChar」。這可能是相關的嗎?
感謝
(這似乎是一個非常簡單的和瑣碎的問題,因爲如果我做了一些可憐的愚蠢的錯誤了,但我就是不能解決吧!)
編輯:
好吧,這是有關編碼的東西。
我從字典中取出字符串鍵並將其與我的get參數進行比較。
打印時,它們是相同的,但java說它們不相同。
密鑰字符串來自UTF-8編碼的文本文件,而參數字符串來自java Eclipse文字。
但是,這些字符是相同的。
什麼問題,我該如何解決?
謝謝!
編輯:
嗯,這裏就是實際發生在幕後。
我有一個UTF-8文本文件,其中包含以下內容...
variableIndent,@
equalsIndent,#
spaceChar,
newlineChar,\n
multiplyChar,×
divideChar,÷
plusChar,+
equalsChar,=
subjectChar,:
thusChar,∴
我「負荷」這個文件通過讀取文件作爲ArrayList<String>
元素的每一行,通過傳遞文件的目錄:
private static ArrayList<String> readLinesFile(String ResourceFile) {
ArrayList<String> Lines = new ArrayList<String>();
try{
InputStream fstream = FileManager.class.getResourceAsStream(ResourceFile);
BufferedReader br = new BufferedReader(new InputStreamReader(fstream));
String strLine;
while ((strLine = br.readLine()) != null) {
Lines.add(strLine); }
in.close(); }
catch (Exception e) {
System.out.println("Error: " + e.getMessage()); }
return Lines; }
一切都好了這裏。
然後,我將這個ArrayList傳遞給一個函數,該函數通過「,」字符分割每個元素(使用個人包中的函數;這絕對不是問題),並將第一部分作爲關鍵字添加到第二個新的字典。
private static Map<String, String> generateBaseUnits_Characters_Prefixes(ArrayList<String> FileContent) {
Map<String, String> BaseUnitsCache = new HashMap<String, String>();
ArrayList<String> currentLine;
for (int i=0; i<FileContent.size(); i++) {
currentLine = MiscellaneousFunctions.splitString(FileContent.get(i), ",");
BaseUnitsCache.put(currentLine.get(0), currentLine.get(1)); }
return BaseUnitsCache; }
這會產生導致所有問題的字典。
我有一組關鍵文字對應於文本文件中的字符名稱,我用它來訪問程序中的字典。
public static String variableIndentKey = "variableIndent";
public static String equalsIndentKey = "equalsIndent";
public static String spaceCharKey = "spaceChar";
public static String newlineCharKey = "newlineChar";
public static String multiplyCharKey = "multiplyChar";
public static String divideCharKey = "divideChar";
public static String plusCharKey = "plusChar";
public static String equalsCharKey = "equalsChar";
public static String subjectCharKey = "subjectChar";
public static String thusCharKey = "thusChar";
這裏的問題:
在字典文本文件 '螺絲了' 的頂行。 它被添加到字典中並正確顯示在字典的keySet和打印格式中,但試圖訪問它將返回「null」。
(在這種情況下,它是variableIndent,如果我把文本文件中的其他地方的variableIndent放在文本文件中,equalsIndent擰起來等)
發生什麼事了!?
我有一個狡猾的功能嗎?!
他們對其他一切都很好。
謝謝!
爲了保證這關鍵是存在(UTF-8 BOM 0xEF,爲0xBB,爲0xBF「variableIndent」前),遍歷所有在此映射按鍵和打印他們的價值。 – 2012-08-11 07:07:38
你能展示一些重現行爲嗎? – assylias 2012-08-11 07:08:59
編輯了OP。相信它是文本文件和Eclipse之間的編碼問題。 – 2012-08-11 07:34:50