如果没有throw异常删除一个键,但它没有?

时间:2016-10-23 11:54:35

标签: java hashtable

我目前正在为哈希表开发此方法,目前看起来一样。

  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时,它在从哈希表中删除实际条目时起作用,但是当它在那里它抛出异常但不删除实际条目?

2 个答案:

答案 0 :(得分:0)

我怀疑List [i]是alredy null和&#39;如果&#39;块永远不会被执行。在那种情况下:

  • 保留MapException异常将被抛出

  • 删除MapException将不会在该迭代中执行任何操作,List [i]将保留null值,这会让您思考&#39;如果&#39;块已被执行。

答案 1 :(得分:0)

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

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

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:在编写代码时要有一定程度的谨慎,这可以防止很多头痛的情况(&#34;为什么这不起作用......&#34;)。在你的粘贴代码中,有几件东西会闻到&#34;:

  1. 删除未使用的代码(&#34; // TODO自动生成的方法存根&#34;)
  2. 服从完美的格式(缩进)
  3. 遵循命名的常见用法:变量和方法以较低的字母开头,类以大写字母开头。名称&#34;列表&#34;已经存在于java中作为类(接口)的名称。 AND:&#34; list&#34;不多说。在这里,最好将其命名为&#34; keys&#34;。
  4. BTW3:您似乎只将删除键设置为null。什么是相关价值(您正在谈论&#34;地图&#34;)?