1

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

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

add_direct 方法应该将一个字符和一个由空格分隔的单个空格分隔的字符组成一个数组列表。然后我尝试插入 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);***

}
}

我有点困惑,因为 dependenciesList、key 或dependentItemsArray 不为空

4

4 回答 4

3

当您HashMap<Character, ArrayList> dependenciesList在构造函数中指定时,该映射与类字段dependenciesList不同。去掉前面的类型标识符。当您在方法中引用时,那是未初始化的类字段。dependenciesListadd_direct

您可能想重新了解 Java 中的块作用域是如何工作的。在块内声明一个新变量,例如与更高范围内的变量同名的构造函数,会隐藏现有声明。

您将来可能还希望遵循 Java 样式约定,以帮助其他必须阅读您的代码的人。

于 2012-12-08T22:10:14.130 回答
3

实际上,dependenciesList 空的。您在构造函数中初始化的变量:

HashMap<Character, ArrayList> dependenciesList = new HashMap<Character, ArrayList>();

只是设置一个局部变量,该变量在函数结束时被释放。移除前导类型 ( HashMap<Character, ArrayList>) 以使其初始化实例变量。

于 2012-12-08T22:10:26.687 回答
2

您尚未初始化您的依赖项列表。

进行以下更改

public class Dependencies {
  HashMap<Character, ArrayList>  dependenciesList;


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

您在构造函数中创建了一个新的 HashMap,但您的类变量dependenciesList为空

于 2012-12-08T22:10:59.623 回答
-1

您未能初始化您的依赖项列表。请进行空值检查,然后将任何值设置为最佳实践。

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]}
于 2017-09-07T07:32:37.873 回答