java-当我重复使用一个元素然后将该键的值更新为一个hashmap时反复出错

时间:2012-06-03 08:51:39

标签: java hashmap

我正在开发一个执行重复编程任务的应用程序。

作为此任务的一部分,将值赋给变量,然后将此变量插入到散列映射中,在某些操作中使用,然后将hashmap中的值替换为同一变量中的新值。

我的意思是,在第一个值用完之后,另一个值被分配给同一个变量 - >变量被插入到从hashmap获取的hashmap->值中,以便在操作中使用 - >等等。

以这种方式添加了许多值 - >使用 - >从hashmap更新。这一切都发生在while循环中,它也有一个计数器变量。

问题是在while循环的随机阶段突然发生错误,即hashmap不包含具有指定键的对象。

这永远不会发生在while循环的同一个计数器上......我在这里做错了什么?这是因为我反复插入 - >使用 - >更新值到hashmap?

对于你的ref,下面给出了将数据插入hashmap的代码 -

   /* Function to store a variable- key value pair at designated level, in scraper context..
  *
  */
 public Object putVar(Object key, Variable value, Integer level) {
    super.put((this.getStringKey(key)+"~"+level.toString()), value);
    return null;
 }

从hashmap获取数据的代码如下 -

 /* Function to obtain object (value) with specified key and level in scraper context...
 *
 */
public Object get(Object key, Integer level) {

    String req= this.getStringKey(key);
    boolean found=false;
    System.out.println(" REQUIRED- Variable name="+ req + "level="+ level);
    for(int i= level; i>=1; i--)
    {
        if(this.containsKey(req+"~"+level.toString()) )
        {
            found=true;
            break;
        }
    }
    if(found==true)
        return(this.get(req+"~"+level.toString()));
    else
        return null;
}

UPDATE-异常堆栈跟踪在下面给出---

 ERROR - Variable 'webpage' is not defined!
 org.webharvest.exception.VariableException: Variable 'webpage' is not defined!
at org.webharvest.runtime.processors.VarProcessor.execute(VarProcessor.java:70)
at org.webharvest.runtime.processors.BaseProcessor.run(BaseProcessor.java:119)
at org.webharvest.runtime.processors.BodyProcessor.execute(BodyProcessor.java:28)
at org.webharvest.runtime.processors.BaseProcessor.getBodyTextContent(BaseProcessor.java:176)
at org.webharvest.runtime.processors.BaseProcessor.getBodyTextContent(BaseProcessor.java:184)
at org.webharvest.runtime.processors.BaseProcessor.getBodyTextContent(BaseProcessor.java:188)
at org.webharvest.runtime.processors.FileProcessor.executeFileWrite(FileProcessor.java:146)
at org.webharvest.runtime.processors.FileProcessor.execute(FileProcessor.java:95)
at org.webharvest.runtime.processors.BaseProcessor.run(BaseProcessor.java:119)
at org.webharvest.runtime.processors.BodyProcessor.execute(BodyProcessor.java:28)
at org.webharvest.runtime.processors.WhileProcessor.execute(WhileProcessor.java:112)
at org.webharvest.runtime.processors.BaseProcessor.run(BaseProcessor.java:119)
at org.webharvest.runtime.Scraper.execute(Scraper.java:179)
at org.webharvest.runtime.Scraper.execute(Scraper.java:195)
at org.webharvest.gui.ScraperExecutionThread.run(ScraperExecutionThread.java:56)

最后,下面给出了抛出此异常的相关代码 - 正在使用的hashmap的名称是'context'

Variable var = (Variable) context.get(name, curr_level);
 if (var == null) {
        throw new VariableException("Variable '" + name + "' is not defined!");
    }

2 个答案:

答案 0 :(得分:1)

您的getputput的价值与level的价值不同。你的get做了一些迭代,但迭代变量i 在任何地方使用。对get中的散列映射的所有访问都使用相同的level固定值。

这对我来说似乎不太可疑。

答案 1 :(得分:1)

您需要确保在级别找到您找到的值:

即。您需要稍微更改get方法:

/**
 * Function to obtain object (value) with specified key and level in scraper context
 * i.e. if a value is not found for the key at the given level, lower levels will
 * be searched.
 */
public Object get(Object key, Integer level) {
    String req= this.getStringKey(key);
    System.out.println(" REQUIRED- Variable name="+ req + "level="+ level);
    for(int i= level; i>=1; i--) {
        if(this.containsKey(req + "~" + i) ) {
            return(this.get(req + "~" + i));
        }
    }
    return null; //or, throw your exception here to differentiate between
                 //finding a null value and not finding the key at all
}

目前,您只检查并返回键req+"~"+level.toString()的值。您还可以考虑向异常添加更多信息,例如get失败的级别。