Java 如果没有throw异常,则删除一个键,但使用它不会';T

Java 如果没有throw异常,则删除一个键,但使用它不会';T,java,hashtable,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

我目前正在为我的哈希表开发这个方法,目前看起来也是这样

  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);
        }
    }

}
public void remove(字符串键)引发MapException{
//TODO自动生成的方法存根

对于(int i=0;ii),我怀疑列表[i]总是为空,并且从不执行“if”块。在这种情况下:

  • 保留MapException将引发异常

  • 删除MapException在该迭代中将不会执行任何操作,列表[i]将保留空值,这会导致您认为已经执行了“if”块


您的循环将抛出第一个找到的条目,该条目为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" );
    }
}
public void remove(字符串键)引发异常
{
布尔删除=假;
for(int i=0;i
BTW1:异常构造函数中的第二个参数用于提供嵌入式异常(例如,在catch块中,您希望将捕获的异常嵌入到新异常中)。提供null是没有意义的

BTW2:在编写代码时一定程度的谨慎可以避免很多令人头痛的情况(“为什么这不起作用…”)。在粘贴的代码中,有几种东西是“气味”:

  • 删除未使用的代码(“//TODO自动生成的方法存根”)
  • 遵守完美的格式(缩进)
  • 遵循命名的常见用法:变量和方法以小写字母开头,类以大写字母开头。名称“List”在java中已经作为类(接口)的名称存在。“List”没有太多含义。在这里,最好将其命名为“keys”

  • BTW3:您似乎只将delete键设置为null。关联值(您指的是“map”)是什么?

    逐步检查您的代码。如果
    i=0
    ,会发生什么情况?
    如果
    是真的吗?我打赌不是。提示:处理代码的格式…仅处理您的其他代码“存在”这一事实左边太远会使您的代码更难理解。。。