Map中的值:无法将Integer解析为Integer

时间:2017-06-23 14:15:55

标签: java dictionary hashmap

我遇到了一个问题,即使我的教授经过一个小时的调查也无法解决:我有一个地图,它存储每个级别的高分值,其中级别保存为字符串,整数代表高分。 现在,当我尝试读取一个级别的高分时,我得到了这个非常奇怪的问题:在调用方法来读取高分时,我得到一个错误说

java.lang.String cannot be cast to java.lang.Integer

代码如下

public Map<String, Integer> highscores = new HashMap<>();
highscores.put("Level1", 35); //Example, we read it from a file
int highscore = highscores.get("Level1");

错误发生在第三行。有谁知道为什么会这样? Integer.parseInt 也不起作用,因为该方法说它需要一个String而不是一个Integer作为参数,这意味着该行的右侧实际上是一个Integer。非常感谢任何帮助。

5 个答案:

答案 0 :(得分:1)

当您从文件中读取乐谱时,它会将其作为字符串读取,然后尝试将其作为String对象而不是{{Integer对象粘贴到HashMap中1}}对象。这个例外的来源是:

java.lang.String cannot be cast to java.lang.Integer

答案 1 :(得分:1)

当你说你从一个文件中读取它时,你确定它是一个整数而不是一个字符串吗?

代码行

int highscore = highscores.get("Level1");

执行两项操作,类似于以下内容:

Integer highscoreObj = highscores.get("Level1");
int highscore = highscoreObj.intValue();

尝试这个时会发生什么?

答案 2 :(得分:1)

我刚刚在阅读文件时找到答案,不知道我是如何忽略这个的!它说

highscores = gson.fromJson(new BufferedReader(
                                new FileReader("ressources/highscores.json")),
                    new TypeToken<Map<String, String>>() {}.getType()); 

这显然使Map的值变为String。将第二个参数更改为Map<String, Integer>可以解决问题。感谢您的快速回复!

答案 3 :(得分:0)

似乎你在这里提到的代码非常好,当你从文件中读取时,很可能会发生这个问题。

Integer进入put()之前,您确定要将从文件中读取的内容转换为Map吗?

可能是你想做这样的事情:

public class Test {
    public static Map<String, Integer> highscores = new HashMap<>();

    public static void main(String[] args) throws IOException {
        BufferedReader reader = new BufferedReader(new InputStreamReader(Test.class.getResourceAsStream("input.txt")));

        String line = null;
        while ((line = reader.readLine()) != null) {
            String[] tokens = line.split(",");
            highscores.put(tokens[0], Integer.parseInt(tokens[1]));
        }

        System.out.println(highscores.get("Level1"));
        System.out.println(highscores.get("Level2"));
    }
}

输入文件

Level1,35
Level2,65

输出

35
65

答案 4 :(得分:0)

您应该确定highscores类型的元素。类似于以下代码:

System.out.println(highscores.get("Level1").getClass());

我猜,如果结果为class java.lang.Integer

,则上述代码的结果不是Class java.lang.String

您可以将代码修改为以下内容:

    Map<String, Integer> highscores = new HashMap<>();
    highscores.put("Level1", 35); //Example, we read it from a file
    Object item=highscores.get("Level1");
    if(item.getClass().equals(String.class)) {
        highscore= Integer.parseInt((String) item);
    }else if(item.getClass().equals(Integer.class)){
        highscore=(Integer)item;
    }