这是我们正在寻找类似于库的麻烦方法。它的目的是让所有类都可以使用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
。
为什么会这样?我该如何解决这个问题?
如果忘记我有两个不同的实例。但是,如果不创建实例,静态/非静态方法就会出现问题。什么是更好的解决方案,所以我可以在不使用静态方法创建新实例的情况下调用它?
答案 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。