【问题标题】:value in a Map: Can't parse Integer to Integer地图中的值:无法将整数解析为整数
【发布时间】:2017-06-23 14:15:55
【问题描述】:

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

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 也不起作用,因为该方法说它需要一个字符串而不是整数作为参数,这意味着该行的右侧实际上是一个整数。非常感谢任何帮助。

【问题讨论】:

标签: java dictionary hashmap


【解决方案1】:

听起来,当您从文件中读取分数时,它会将其作为字符串读取,然后尝试将其作为 String 对象而不是 Integer 对象粘贴到 HashMap 中。这就是这个异常的来源:

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

【讨论】:

    【解决方案2】:

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

    代码行

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

    做了两件事,类似于下面的:

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

    当你尝试这个时会发生什么?

    【讨论】:

    • “当你尝试这个时会发生什么?”完全一样,因为这只是手动拆箱,而不是让编译器来做。问题是highscores.get("Level1") 不是Integer
    【解决方案3】:

    我只是在阅读文件中找到了答案,不知道我怎么忽略了这个!它说

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

    这显然使 Map 的值成为一个字符串。将第二个参数更改为 Map&lt;String, Integer&gt; 即可解决问题。感谢您的快速回复!

    【讨论】:

    • 但这肯定不会是类型正确的,除非 highscores 映射在这种情况下是原始的?请出示您的highscores声明。
    • 问题中可以看到地图的删除
    • @AndyTurner 这里只传递了一个Type,编译器无法从中推断出返回类型,所以它是从受让人推断出来的,即Map&lt;String, Integer&gt;
    【解决方案4】:

    你应该确定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;
        }
    

    【讨论】:

      【解决方案5】:

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

      在将put() 转换为Map 之前,您确定将从文件中读取的任何内容转换为Integer

      也许你正在尝试做这样的事情:

      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2011-06-03
        • 1970-01-01
        • 2014-01-20
        • 1970-01-01
        • 2012-10-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多