没有抛出异常会删除密钥,但不会?



我目前正在为我的哈希表使用这个方法,它目前看起来是这样的。

  public void remove(String key) throws MapException {
    // TODO Auto-generated method stub
        for(int i = 0; i <List.length;i++){
            if(List[i] !=null && List[i].equals(key)){
            List[i] = null;
            numberOfElements--;
        }else{
             throw new MapException("Nothing here", null);
        }
    }
}

我的问题是,当我删除抛出新的MapException时,它可以从哈希表中删除实际条目,但当它存在时,它会抛出异常,但不删除实际条目?

我怀疑List[I]已经为空并且'if'块从未执行过。在这种情况下:

  • 保持MapException异常将被抛出

  • 删除MapException将在该迭代中不执行任何操作,List[i]将保留空值,这导致您认为'if'块已被执行。

循环抛出第一个找到的条目,该条目为空或其键不等于给定的键。因此,如果您想要删除的键位于列表中的该键之后,则永远不会到达该键。

您应该更改if语句中的逻辑,以检查它是否不是搜索键,以便继续执行下一个列表条目。如果你找到了一个键并删除了它,那么你必须记住它,以便抛出AFTER循环:

public void remove( String key ) throws Exception
{
    boolean deleted = false;
    for ( int i = 0; i < list.length; i++ )
    {
        if ( List[i] == null || !List[i].equals( key ) )
        {
            continue;
        }
        ist[i] = null;
        numberOfElements--;
        deleted = true;
    }
    if ( !deleted )
    {
        throw new Exception( "Nothing here" );
    }
}

BTW1:异常构造函数中的第二个参数用于提供嵌入异常(例如,在catch块中,您希望将捕获的异常嵌入到新异常中)。提供null是没有意义的。

BTW2:在编写代码时一定程度的谨慎可以防止许多令人头痛的情况("为什么这不起作用……")。在您粘贴的代码中,有几个东西"闻起来":

  1. 删除未使用的代码("//TODO自动生成方法存根")
  2. 遵循完美的格式(缩进)
  3. 遵循常用的命名方式:变量和方法以小写字母开头,类以大写字母开头。名称"List"在java中已经作为类(接口)的名称存在。AND:"list"并没有说太多。此处最好将其命名为"keys"。

BTW3:你好像只把要删除的键设置为空。关联值是什么(你说的是"map")?

最新更新