我目前正在为哈希表开发此方法,目前看起来一样。
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时,它在从哈希表中删除实际条目时起作用,但是当它在那里它抛出异常但不删除实际条目?
答案 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;:BTW3:您似乎只将删除键设置为null。什么是相关价值(您正在谈论&#34;地图&#34;)?