我知道Java中的NoSuchElementException有很多线程,但我仍然无法弄清楚这里发生了什么
我正在尝试为http://codekata.pragprog.com/2007/01/kata_eighteen_t.html
发布的Transitive Dependencies Kata 18提供解决方案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;
}
}
我有点perprlexed因为processingDependencies和finalDependencies ArrayLists不为null。而processingDependencies arraylist包含一个项目
答案 0 :(得分:1)
你打了两次电话。第一个呼叫由匹配的hasNext呼叫“保护”。第二个不是。将next的结果保存到临时变量中并使用它,而不是直接使用该值,因为每次调用next都会先尝试推进迭代器。在好的情况下,你得到一个例外。在坏的情况下,事情似乎有效,但你的程序正在处理错误的值。
答案 1 :(得分: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()三次次?
答案 2 :(得分:0)
问题在于:
HashMap dependenciesList;
public Dependencies()
{
HashMap<Character, ArrayList> dependenciesList = new HashMap<Character, ArrayList>();
}
您声明了一个名为dependenciesList的哈希映射。然后,您尝试实例化该列表,但实际上您要创建一个名为相同内容的局部变量。它们是两个独立的变量。然后你尝试使用那里尚未实例化的那个:
ArrayList processingDependencies = dependenciesList.get(key);
您需要做的是实例化第一个依赖项列表而不是创建新的
(我不是java的专家,但dependenciesList = new HashMap....()
代替HashMap<..> dependenciesList = new HashMap...()