我遇到了一个问题,即使我的教授经过一个小时的调查也无法解决:我有一个地图,它存储每个级别的高分值,其中级别保存为字符串,整数代表高分。 现在,当我尝试读取一个级别的高分时,我得到了这个非常奇怪的问题:在调用方法来读取高分时,我得到一个错误说
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。非常感谢任何帮助。
答案 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;
}