我知道Java中的Null指针异常有很多线程,但我仍然无法弄清楚这里发生了什么
我正在尝试为http://codekata.pragprog.com/2007/01/kata_eighteen_t.html
发布的Transitive Dependencies Kata 18提供解决方案add_direct方法应该接受一个char和一个由空格分隔的单个空格分隔字符的srting到ArrayList中。然后我尝试插入到ArrayLists的HashMap中,其中初始char是键,我解析的ArrayList是项。这是我的NullPointerException发生的地方。我已经跟踪了所有这些数据结构,但没有一个具有Null值。我不明白在这里造成我的例外是什么。请看我的代码:
public class Test_Dependencies
{
public static void main(String[] args) {
Dependencies Dep = new Dependencies();
Dep.add_direct('A', "B C");
}
}
public class Dependencies {
HashMap dependenciesList;
public Dependencies()
{
HashMap<Character, ArrayList> dependenciesList = new HashMap<Character, ArrayList>();
}
public void add_direct(char mainItem, String dependentItems)
{
String[] individualItems = dependentItems.split("\\s+");
ArrayList<Character> dependendentItemsArray;
dependendentItemsArray = new ArrayList<Character>();
//put all items into the ArrayList
for(int i = 0; i < individualItems.length; i++)
{
Character c = new Character(individualItems[i].charAt(0));
dependendentItemsArray.add(c);
}
// insert dependency
Character key = new Character(mainItem);
***//NULL POINTER EXCEPTION HERE
dependenciesList.put(key, dependendentItemsArray);***
}
}
我有点perprlexed因为dependenciesList,key或dependentItemsArray不为null
答案 0 :(得分:3)
在构造函数中指定HashMap<Character, ArrayList> dependenciesList
时,这是一个不同的映射,而不是类字段 dependenciesList。摆脱它前面的类型标识符。当您在dependenciesList
方法中引用add_direct
时,这是未初始化的类字段。
您可能希望了解块作用域在Java中的工作原理。在块内声明一个新变量,例如构造函数,其名称与更高范围内的变量相同阴影现有声明。
您可能还希望将来遵循Java样式约定,以帮助其他必须阅读您代码的人。
答案 1 :(得分:3)
实际上,dependenciesList
为空。您在构造函数中初始化的变量:
HashMap<Character, ArrayList> dependenciesList = new HashMap<Character, ArrayList>();
仅设置一个局部变量,该变量在函数末尾被释放。删除前导类型(HashMap<Character, ArrayList>
)以使其初始化实例变量。
答案 2 :(得分:2)
您尚未初始化您的dependenciesList。
进行以下更改
public class Dependencies {
HashMap<Character, ArrayList> dependenciesList;
public Dependencies()
{
dependenciesList = new HashMap<Character, ArrayList>();
}
....
}
您在内部构造函数中创建了一个新的HashMap,但您的类变量dependenciesList
为null
答案 3 :(得分:-1)
您无法初始化您的dependenciesList。请进行空检查,然后将任何值设置为最佳做法。
package com.stackoverflow.examples;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
public class Dependencies {
public void add_direct(char mainItem, String dependentItems) {
String[] individualItems = dependentItems.split("\\s+");
HashMap<Character, ArrayList<Character>> dependenciesList = new HashMap<Character, ArrayList<Character>>();
ArrayList<Character> dependendentItemsArray = new ArrayList<Character>();
// Put all items into the ArrayList
for (int i = 0; i < individualItems.length; i++) {
Character c = new Character(individualItems[i].charAt(0));
dependendentItemsArray.add(c);
}
// Insert dependency
Character key = new Character(mainItem);
// Always check null before put
if (dependenciesList != null)
dependenciesList.put(key, dependendentItemsArray);
System.out.println("dependenciesArray---->" + dependendentItemsArray);
System.out.println("dependenciesList---->" + dependenciesList);
}
}
输出:
dependenciesArray---->[B, C]
dependenciesList---->{A=[B, C]}