【问题标题】:NullPointerException when putting a non-null key and value into a Hashtable将非空键和值放入哈希表时出现 NullPointerException
【发布时间】:2012-11-26 13:53:06
【问题描述】:

当 put() 的两个参数都不为 null 时,以下代码中会发生 java.util.Hashtable 的空指针异常:

import java.util.Hashtable;

interface action
{
   void method();
}

class forclass implements action
{
  public void method()
  {
    System.out.println("for(...){");
  }
}

class ifclass implements action
{
  public void method()
  {
    System.out.println("if(..){");
  }
}

public class trial
{
  static Hashtable<String,action> callfunc;
  //a hashtable variable
  public static void init()
  {
    //System.out.println("for"==null); //false
    //System.out.println(new forclass() == null); //false
    callfunc.put("for",new forclass()); //exception occuring here
    callfunc.put("if",new ifclass());
    //putting values into the hashtable
  }
  public static void main(String[] args)
  {
    init(); //to put stuff into hashtable
    action a = callfunc.get("for");
    //getting values for specified key in hashtable
    a.method();
    callfunc.get("if").method();
  }
}

线程“main”中的异常 java.lang.NullPointerException -
在 trial.init(trial.java:33)
在 trial.main(trial.java:38)
为什么会发生此异常?我该如何解决?

【问题讨论】:

  • 除非必须,否则不要使用 Hashtable,请使用 Java 代码约定,例如 TitleCase 作为类名。

标签: java nullpointerexception hashtable


【解决方案1】:

你还没有初始化你的Hashtable:-

static Hashtable<String,action> callfunc; // Reference points to null

当 put() 的两个参数都不为空时

您应该使用HashMap,它允许1 null key,以避免在使用putnull key 时获得NPE,在Hashtable 的情况下抛出NPE 的方法,因为它不会允许null keys, or value

因此,将您的声明更改为:-

static Hashtable<String,action> callfunc = new Hashtable<String, action>();

甚至更好:-

static Map<String, action> callfunc = new HashMap<String, action>();

附带说明,您应该在代码中遵循Java Naming Convention。所有的类名和接口名,以UpperCase字母开头,后面跟CamelCasing

【讨论】:

  • 哎呀愚蠢的错误感谢修复它,也根据文档 public Object put(Object key, Object value) 确实抛出 NullPointerException - 如果键或值为 null,所以我正在检查并忽略你指出的错误
  • @ShruthiB.S..啊!忘记了您使用的是不允许空键的Hashtable。您应该使用HashMap,它允许1 null 键。
【解决方案2】:

callfunc 引用为 null 而不是输入。

试试这个:

static Hashtable<String,action> callfunc = new Hashtable<String,action>()

this 的帖子也可能对您想要Hashtable 还是HashMap 有用

【讨论】:

  • 正确 - 抱歉,我假设 java 的命名约定会在这里生效,我会更新帖子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-01-25
  • 1970-01-01
  • 2012-11-05
  • 2020-02-20
  • 1970-01-01
  • 2016-05-23
  • 2021-03-09
相关资源
最近更新 更多