Java 在hashmap中迭代-引发异常

Java 在hashmap中迭代-引发异常,java,hashmap,Java,Hashmap,这与我先前提出的一个问题有关: 虽然我假设我可以为我的remove方法应用与add方法类似的逻辑,但是我必须检查一个不存在的记录的异常被抛出,即使我非常清楚该记录存在并且应该被删除。我的删除方法如下: public boolean removePatron(int libraryCardNumber) throws PatronException { boolean patronRemoved = false; int keyToRemove = 0; for

这与我先前提出的一个问题有关:

虽然我假设我可以为我的remove方法应用与add方法类似的逻辑,但是我必须检查一个不存在的记录的异常被抛出,即使我非常清楚该记录存在并且应该被删除。我的删除方法如下:

    public boolean removePatron(int libraryCardNumber) throws PatronException {
    boolean patronRemoved = false;
    int keyToRemove = 0;
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
        if (entry.getValue().getCardNumber() != libraryCardNumber) {
            throw new PatronException("This record does not exist");

        }
        keyToRemove = entry.getKey();
    }
    patrons.remove(keyToRemove);
    patronRemoved = true;
    return patronRemoved;
}
我的测试只是先添加三个用户,然后尝试通过一个我知道会存在的卡号将其删除。我在add方法中添加了一个用户编号的println,以便在eclipse中添加用户编号时可以轻松地看到它们

    @Test
public void testRemovePatron() {
    boolean exceptionThrown = false;
    try {
        testLibrary.addPatron("TestName");
        testLibrary.addPatron("TestName2");
        testLibrary.addPatron("TestName3");
        testLibrary.removePatron(1);
    } catch (PatronException e) {
        System.out.println(e.getMessage());
        exceptionThrown = true;
        fail("what the hell is going on");
    }
    assertFalse(exceptionThrown);
}
我每次都从抛出的remove方法中得到异常

编辑:我对提供的答案做了一个小改动,以说明如果没有找到匹配项,需要抛出异常:

    public boolean removePatron(int libraryCardNumber) throws PatronException {
    boolean patronRemoved = false;
    int keyToRemove = 0;
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) 
    {
        if (entry.getValue().getCardNumber() == libraryCardNumber) 
        {
            keyToRemove = entry.getKey();
            patronRemoved = true;
        }
    }
    if (patronRemoved)
    {
        patrons.remove(keyToRemove);
    } else {
        throw new PatronException("This record did not exist");
    }
    return patronRemoved;
}
public boolean removeponsor(int librarycardname)引发用户异常{
布尔值=假;
int keyToRemove=0;
for(Map.Entry:customers.entrySet())
{
if(entry.getValue().getCardNumber()==libraryCardNumber)
{
keyToRemove=entry.getKey();
已删除=真;
}
}
如果(已删除)
{
用户。移除(按键移除);
}否则{
抛出新异常(“此记录不存在”);
}
退票;
}
因此,如果第一个条目与您的参数不匹配,将引发异常。这就是为什么会抛出自定义异常。逻辑是有缺陷的

再看一眼,它可能比这要复杂一些,因为您没有提供添加条目的代码。但这将是我的第一个猜测

编辑:

在我看来,您似乎还想检查该值是否存在,以及ti是否删除了该值。您不必通过循环来实现这一点

看看hashmapapi中的
containsKey
containsValue
方法。然后您可以简单地调用
remove
方法

阅读注释后,您还应该评估
if(**entry.getKey()**!=librarycardname)
这比依赖可变值对象字段要干净得多。

除了一条记录外,if语句(for循环内)将不匹配。if语句必须移到for循环之外

if块后面的语句也必须离开for循环。您不希望对地图的每个成员都执行该操作,只对地图的一个成员执行该操作


尝试java.util.Map的containsKey函数。

您会因为以下代码而出现异常

 if (entry.getValue().getCardNumber() != libraryCardNumber) {
        throw new PatronException("This record does not exist");

    }
假设Map中有3条记录[0,1,2],您将
libraryCardNumber
传递为1。你的情况只是第一次失败。注意hashmap并不能保证顺序,为了更好地理解,我们使用了顺序示例

public boolean removeDuplicateCardNumber(int libraryCardNumber) {
    for (Iterator<Map.Entry<Integer, Patron>> i = myMap.entrySet()
            .iterator(); i.hasNext();) {
        Map.Entry<Integer, Patron> entry = i.next();
        if (entry.getValue().getCardNumber() == libraryCardNumber) {
            i.remove();
            return true;
        }
    }
    return false;
}
public boolean removeDuplicateCardNumber(int libraryCardNumber){
for(迭代器i=myMap.entrySet()
.iterator();i.hasNext();){
Map.Entry=i.next();
if(entry.getValue().getCardNumber()==libraryCardNumber){
i、 删除();
返回true;
}
}
返回false;
}

对于您要查找的用户以外的任何用户,都会引发异常。 更改此项:

public boolean removePatron(int libraryCardNumber) throws PatronException{
    boolean patronRemoved = false;
    int keyToRemove = 0;
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
        if (entry.getValue().getCardNumber() != libraryCardNumber) {
            throw new PatronException("This record does not exist");

        }
        keyToRemove = entry.getKey();
    }
    patrons.remove(keyToRemove);
    patronRemoved = true;
    return patronRemoved;
}
public boolean removeponsor(int librarycardname)引发用户异常{
布尔值=假;
int keyToRemove=0;
for(Map.Entry:customers.entrySet()){
if(entry.getValue().getCardNumber()!=libraryCardNumber){
抛出新异常(“此记录不存在”);
}
keyToRemove=entry.getKey();
}
用户。移除(按键移除);
已删除=真;
退票;
}
为此:

public boolean removePatron(int libraryCardNumber) {
    boolean patronRemoved = false;
    int keyToRemove = 0;
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) 
    {
        if (entry.getValue().getCardNumber() == libraryCardNumber) 
        {
            keyToRemove = entry.getKey();
            found = true;
        }
    }
    if (found)
    {
        patrons.remove(keyToRemove);
    }
    return patronRemoved;
}
公共布尔删除用户(int libraryCardNumber){
布尔值=假;
int keyToRemove=0;
for(Map.Entry:customers.entrySet())
{
if(entry.getValue().getCardNumber()==libraryCardNumber)
{
keyToRemove=entry.getKey();
发现=真;
}
}
如果(找到)
{
用户。移除(按键移除);
}
退票;
}

或者更简洁地说,正如AmitD所展示的那样

你想要实现什么?你的逻辑是什么?我有一张可以添加到的用户列表地图,如:map.Entry:patrons.entrySet()所示。我希望通过提供一个数字来删除记录,该数字将与用户对象中的卡号相对应,该对象由字符串名和int cardname构成。创建用户时,int卡号与hashmap中用户的密钥相同。@Thihara它抛出抛出新用户异常(“此记录不存在”);无论我提供什么卡号,它都不会通过这个例外什么是
addPatron
方法?因为它最符合我需要完成的项目。我做了一些小的改动,我会在原来的问题上加上。
public boolean removeDuplicateCardNumber(int libraryCardNumber) {
    for (Iterator<Map.Entry<Integer, Patron>> i = myMap.entrySet()
            .iterator(); i.hasNext();) {
        Map.Entry<Integer, Patron> entry = i.next();
        if (entry.getValue().getCardNumber() == libraryCardNumber) {
            i.remove();
            return true;
        }
    }
    return false;
}
public boolean removePatron(int libraryCardNumber) throws PatronException{
    boolean patronRemoved = false;
    int keyToRemove = 0;
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) {
        if (entry.getValue().getCardNumber() != libraryCardNumber) {
            throw new PatronException("This record does not exist");

        }
        keyToRemove = entry.getKey();
    }
    patrons.remove(keyToRemove);
    patronRemoved = true;
    return patronRemoved;
}
public boolean removePatron(int libraryCardNumber) {
    boolean patronRemoved = false;
    int keyToRemove = 0;
    for (Map.Entry<Integer, Patron> entry : patrons.entrySet()) 
    {
        if (entry.getValue().getCardNumber() == libraryCardNumber) 
        {
            keyToRemove = entry.getKey();
            found = true;
        }
    }
    if (found)
    {
        patrons.remove(keyToRemove);
    }
    return patronRemoved;
}