我正在开发一个执行重复编程任务的应用程序。
作为此任务的一部分,将值赋给变量,然后将此变量插入到散列映射中,在某些操作中使用,然后将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!");
}
答案 0 :(得分:1)
您的get
与put
:put
的价值与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
失败的级别。