1

ここではJavaのNoSuchElementExceptionに多くのスレッドがあることを知っていますが、それでもここで何が起こっているのか理解できません

http://codekata.pragprog.com/2007/01/kata_eighteen_t.htmlに投稿されている推移的な依存関係Kata18の解決策を考え出そうとしています。

依存関係_forメソッドは、charアイテムを受け取り、そのアイテムのすべての依存関係を計算することになっています。finalDependenciesArrayListに要素を追加しようとすると例外が発生します

これは、NullPointerExceptionが発生する場所です。これらのデータ構造をすべてトレースしましたが、Null値はありません。ここで私の例外の原因がわかりません。私のコードを見てください:

public class Test_Dependencies 
{
    public static void main(String[] args) {
             Dependencies Dep = new Dependencies();
             Dep.add_direct('A', "B C");
             Dep.add_direct('B', "C D");
             Dep.dependencies_for('A');

    }
}


public class Dependencies {
      HashMap dependenciesList;


public Dependencies()
{
    HashMap<Character, ArrayList> dependenciesList = new HashMap<Character, ArrayList>();
}

public void add_direct(char mainItem, String dependentItems)
{
  // code that works here   
}

public String dependencies_for(char item)
{

    ArrayList finalDependencies = new ArrayList<Character>();
    Character key = new Character(item);

    //get initial dependencies for the item and add them
    ArrayList processingDependencies = dependenciesList.get(key);
    Iterator itr = processingDependencies.iterator();

    while(itr.hasNext())
    {
        if(finalDependencies.contains(itr.next()) == false && itr.next() != key)
        {

            // NoSuchElement exception here
            finalDependencies.add(itr.next());

            // look again at each item in dependenciesList.  If it is in the list then add it to processingDependencies
            if(dependenciesList.containsKey(itr.next()) && !processingDependencies.contains(itr.next()))
            {
                processingDependencies.add(itr.next());

            }
        }

    }

    // turn finalDependencies into a string
    itr = finalDependencies.iterator();
    String allDependencies = "";
    while(itr.hasNext())
    {
        allDependencies = allDependencies + " " + itr.next();
    }


    return allDependencies;

}
}

processingDependenciesとfinalDependenciesArrayListsがnullではないため、私は少し困惑しています。そして、processingDependenciesarraylistにはアイテムが含まれています

4

3 に答える 3

1

あなたはこれを行うことはできません:

while(itr.hasNext())
{
    if(finalDependencies.contains(itr.next()) == false && itr.next() != key)
    {
        // NoSuchElement exception here
        finalDependencies.add(itr.next());

        // stuff removed
    }
}

itr.next()を呼び出す前に、iter.hasNext()がtrueであることを確認する必要があります。itrの最後の項目に到達した後、itr.next()を3回呼び出すとどうなりますか?

回答:NoSuchElementExceptionイテレータをチェックしてください

于 2012-12-10T19:07:15.247 に答える
1

あなたは二度電話しています。最初の呼び出しは、一致するhasNext呼び出しによって「保護」されます。2番目はそうではありません。nextの結果を一時変数に保存し、値を直接使用する代わりにそれを使用します。これは、nextを呼び出すたびに、最初にイテレーターを進めようとするためです。良いケースでは、例外が発生します。悪いケースでは、物事はうまくいくように見えますが、あなたのプログラムは間違った値を扱っています。

于 2012-12-10T19:04:57.913 に答える
0

問題はここにあります:

HashMap dependenciesList;
public Dependencies()
{
        HashMap<Character, ArrayList> dependenciesList = new HashMap<Character, ArrayList>();
}

依存関係リストと呼ばれるハッシュマップを宣言します。次に、そのリストをインスタンス化しようとしますが、実際に行うことは、同じ名前のローカル変数を作成することです。これらは2つの別個の変数です。次に、ここでインスタンス化されていないものを使用しようとします。

 ArrayList processingDependencies = dependenciesList.get(key);

新しいものを作成する代わりに、最初のdependenciesListをインスタンス化する必要があります

(私はJavaのプロではありませんが、dependenciesList = new HashMap....()代わりにのようなものですHashMap<..> dependenciesList = new HashMap...()

于 2012-12-10T19:08:11.050 に答える