1

我知道这里有很多关于 Java 中 NoSuchElementException 的线程,但我仍然无法弄清楚这里发生了什么

我正在尝试为传递依赖项 Kata 18 提出一个解决方案,该解决方案发布在http://codekata.pragprog.com/2007/01/kata_eighteen_t.html

dependencies_for 方法应该接受一个 char 项目并计算该项目的所有依赖项。当我尝试将元素添加到 finalDependencies ArrayList 时发生异常

这是我的 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 和 finalDependencies ArrayLists 不为空。并且 processingDependencies arraylist 包含一个项目

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() 是否为真。当您到达 itr 中的最后一项,然后调用 itr.next()三次时会发生什么?

答案:NoSuchElementException。查看迭代器

于 2012-12-10T19:07:15.247 回答
1

你打了两次电话。第一个调用由匹配的 hasNext 调用“保护”。第二个不是。将 next 的结果保存到一个临时变量中并使用它,而不是直接使用该值,因为对 next 的每次调用都会尝试首先推进迭代器。在好的情况下,你会得到一个例外。在糟糕的情况下,事情似乎有效,但您的程序正在处理错误的值。

于 2012-12-10T19:04:57.913 回答
0

问题在这里:

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

您声明了一个名为 dependenciesList 的 hashmap。然后您尝试实例化该列表,但您实际上所做的是创建一个名为相同事物的局部变量。它们是两个独立的变量。然后你尝试使用这里没有实例化的那个:

 ArrayList processingDependencies = dependenciesList.get(key);

您需要做的是实例化第一个 dependenciesList 而不是创建一个新的

(我不是 java 的专业人士,但类似于dependenciesList = new HashMap....()而不是HashMap<..> dependenciesList = new HashMap...()

于 2012-12-10T19:08:11.050 回答