为什么这个hashmap行为如此奇怪?:通过来自不同类的方法访问hashmap

时间:2014-01-06 14:54:52

标签: java hashmap

这是我们正在寻找类似于库的麻烦方法。它的目的是让所有类都可以使用hashmap并轻松编辑:

package main;
import java.util.*;

public class Game_Data_Handler {
HashMap<String, Integer> Data_Int = new HashMap<String, Integer>(); 
    public void Setup() {
        Data_Int.put("test", 1);
    }

    public void SetInt(String Value_To_Change, int SetVal) {
        Data_Int.put(Value_To_Change, SetVal);
    }
    public int RecallInt(String RecallVal) {
        return Data_Int.get(RecallVal);
    }
}

我们在这里尝试一些代码:

public class Main_Class {

    public static void main(String[] args) {
        Game_Data_Handler GDH = new Game_Data_Handler();
        GDH.Setup();
        System.out.println(GDH.RecallInt("test"));
    }
}

这会在控制台中输出“1”。


我们现在试试这个:

public class Main_Class {

    public static void main(String[] args) {
        Game_Data_Handler GDH = new Game_Data_Handler();
        GDH.Setup();
            Sub_Class SC = new Sub_Class();
            SC.Print();
    }
}

public class Sub_Class {

        public static void Print() {
            Game_Data_Handler GDH = new Game_Data_Handler();
            System.out.println(GDH.RecallInt("test"));
        }
    }

然后我会得到java.lang.NullPointerException


为什么会这样?我该如何解决这个问题?

如果忘记我有两个不同的实例。但是,如果不创建实例,静态/非静态方法就会出现问题。什么是更好的解决方案,所以我可以在不使用静态方法创建新实例的情况下调用它?

4 个答案:

答案 0 :(得分:2)

因为您在HashMap<String, Integer> Data_Int方法的GDH个实例的Print()中没有放任何内容。

因此,Data_Int.get(RecallVal);将返回null并在尝试通过调用int Integer来获取.intValue()的{​​{1}}时抛出NPE })

实际上,RecallInt可以这样写(为了更好地理解问题):

public int RecallInt(String RecallVal) {
     Integer i = Data_Int.get(RecallVal);
     return i.intValue();
}

每当你用你的地图没有的钥匙调用这个方法时,你的程序就会抛出一个NPE。

答案 1 :(得分:1)

您忘记在此处创建的Setup()变量上致电GDH

public static void Print() {
            Game_Data_Handler GDH = new Game_Data_Handler();
            System.out.println(GDH.RecallInt("test"));
        }

答案 2 :(得分:0)

  Sub_Class SC = new Sub_Class();
  SC.Print();

现在打印方法调用。

 public static void Print() {
            Game_Data_Handler GDH = new Game_Data_Handler();
            System.out.println(GDH.RecallInt("test"));
        }

现在回想一下

public int RecallInt(String RecallVal) {
        return Data_Int.get(RecallVal);
    }

由于地图中没有元素

Data_Int.get(RecallVal)

它是null。并尝试从中获取int值。

决议:

在使用之前调用setUp()方法。

作为附注,请关注java naming conventions.,变量名称以小写字母开头。

答案 3 :(得分:0)

在第二个示例中,您永远不会在Setup()方法中调用print()

导致GDH.RecallInt("test")返回null,从而抛出NPE。