是什么导致了我的空指针异常

时间:2012-12-08 22:06:15

标签: java nullpointerexception

我知道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

4 个答案:

答案 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]}