【问题标题】:While using 2 different HashMaps, i'm able to create a keySet with the first but not the second在使用 2 个不同的 HashMap 时,我可以使用第一个而不是第二个创建一个 keySet
【发布时间】:2013-11-29 06:07:48
【问题描述】:

我在一个类中使用 2 个不同的 HashMaps,当我用第一个(getExitString() 方法)调用 keySet() 方法时,它工作正常,但是当我用第二个调用它时(getLockedDoors() 方法),我得到“找不到符号 - 方法keySet()”错误。我怎样才能解决这个问题?谢谢!相关代码如下。

import java.util.HashMap;
import java.util.Set;

public class Room 
{
private HashMap<String, Room> exits;    
private HashMap<String, LockedDoor> lockedDoors;

public String getExitString() {
    String exitReturn = "";
    Set<String> exitSet = exits.keySet();
    for (String eachExit : exitSet) {
        exitReturn = exitReturn + eachExit + " ";
    }
    return exitReturn;
}

public String getLockedDoorString() {
    String lockedDoors = "";
    Set<String> doorSet = lockedDoors.keySet();
    for (String door : doorSet) {
        lockedDoors = lockedDoors + door + " ";
    }
    return lockedDoors;
}

【问题讨论】:

    标签: java methods hashmap keyset


    【解决方案1】:

    在失败的行中,lockdoors 解析为 String 而不是 HashSet 表达式。

    这是因为局部变量遮蔽了同名的成员变量。

    String lockedDoors = "";                     // shadowed here
    Set<String> doorSet = lockedDoors.keySet();  // and String.keySet() is bogus
    

    解决方案:您可以为局部变量使用不同的名称​​(推荐,IMO),也可以使用 this 关键字来引用实例级变量(a经常需要的概念)。这是一个示例。

    String lockedDoors = "";
    Set<String> doorSet = this.lockedDoors.keySet();
    

    【讨论】:

    • +1 以获得很好的解释。下次也提供解决方案。我已经编辑了这篇文章(等待同行评审)
    • @JAnderton 哎呀,我想我不小心取消了你的编辑:(不过这是个好建议,我添加了一些解决方案。
    • 再次添加解决方案.. :)
    • 哈哈,编辑标签。我要走开看看它的结局xD
    • 感谢您的帮助!没想到我给他们起了同样的名字。
    【解决方案2】:

    您的局部变量名称和 HashMap 的名称相同,因此会出错

    【讨论】:

      【解决方案3】:
      String lockedDoors = "";
      

      lockedDoors 是 String 对象,它与您的 HashMap 的lockedDoors 同名。

      而String类没有keySet方法:)

      【讨论】:

        【解决方案4】:
        String lockedDoors = "";
        Set<String> doorSet = lockedDoors.keySet();
        

        您的代码的主要问题是以上两行,因为“您已经将lockedDoors 声明为hashmap 对象,并且您已在getLockedDoorString() 方法中将lockedDoors 声明为字符串对象”,在这种情况下,lockedDoors 变量始终引用本地字符串锁定的门对象。这就是它抛出错误的原因。 请使用不同的名称或在顶部声明您的变量。

        【讨论】:

          猜你喜欢
          • 2023-02-01
          • 2017-02-26
          • 1970-01-01
          • 1970-01-01
          • 2015-07-07
          • 2013-04-01
          • 2018-10-12
          • 1970-01-01
          • 2022-06-14
          相关资源
          最近更新 更多