3

次のコードでは、put()の引数がどちらもnullでない場合に、java.util.Hashtableのnullポインター例外が発生しています。

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-
attrial.init(trial.java:33)
attrial.main(trial.java:38)
なぜこの例外が発生するのですか?どうすれば修正できますか?

4

2 に答える 2

5

あなたはあなたのを初期化していませんHashtable:-

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

put()の引数がどちらもnullでない場合

を使用するのではなく、を使用する必要がHashMapあります。これを使用すると、を使用するときに1 null key取得を回避できます。これは、スローの場合に、を許可しないためです。NPEputnull keyHashtableNPEnull 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その後に続く必要があります。

于 2012-11-26T13:54:11.150 に答える
1

callfunc参照は入力ではなくnullです。

これを試して:

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

また、このHashtable投稿は、あなたが望むかどうかについて役立つかもしれませんHashMap

于 2012-11-26T13:54:47.377 に答える