1

反復的なプログラミング タスクが実行されるアプリケーションに取り組んでいます。

このタスクの一部として、値が変数に割り当てられ、この変数がハッシュマップに挿入され、一部の操作で使用され、ハッシュマップの値が同じ変数の新しい値に置き換えられます。

つまり、最初の値が使い果たされた後、別の値が同じ変数に割り当てられます->変数がハッシュマップに挿入されます->操作で使用するためにハッシュマップからフェッチされた値->などです。

このようにして、ハッシュマップから多くの値が追加されます->使用されます->更新されます。これはすべて、カウンター変数を持つ while ループで発生しています。

問題は、while ループのランダムな段階で、指定されたキーを持つオブジェクトがハッシュマップに含まれていないというエラーが突然スローされることです。

これは、while ループの同じカウンター番号で発生することはありません...ここで何が間違っていますか? これは、ハッシュマップに値を繰り返し挿入 -> 使用 -> 更新したために発生していますか?

あなたの参照のために、データをハッシュマップに挿入するコードを以下に示します--

   /* 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;
 }

ハッシュマップからデータを取得するコードを以下に示します--

 /* 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;
}

更新- 例外スタック トレースを以下に示します---

 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)

最後に、この例外をスローする関連コードを以下に示します。使用されているハッシュマップの名前は「context」です。

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

2 に答える 2

1

あなたのはあなたgetの と同じではありませんput:putの値を尊重しますlevel。あなたgetはいくつかの反復を行いますが、反復変数iはどこでも使用されていません。のハッシュマップへのすべてのアクセスはget、 の同じ固定値を使用していますlevel

これは私には疑わしい以上に思えます。

于 2012-06-03T09:19:17.027 に答える
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
}

現時点では、 key の値を確認して返すだけですreq+"~"+level.toString()getが失敗するレベルなど、もう少し情報を例外に追加することも検討してください。

于 2012-06-03T09:47:29.733 に答える