public class SecureSystem {
final int low = 0;
final int high = 1;
HashMap<String, int[]> subject;
HashMap<String, int[]> object;
public SecureSystem() {
subject = new HashMap<String, int[]>();
object = new HashMap<String, int[]>();
}
ReferenceMonitor rm = new ReferenceMonitor();
rm.ReferenceMonitor(subject,object);
System.out.println(this.subject.get("a")); // how to make it print [1,2]?
System.out.println(this.object.get("b")); // how to make it print [3,4]?
}
class ReferenceMonitor{
ReferenceMonior(HashMap<String, int[]> subject, HashMap<String, int[]> object) {
SecureSystem ss = new SecureSystem();
ss.subject.put("a", new int{1,2});
ss.object.put("a", new int{3,4})
}
}
我该怎么做呢? 如果我将HashMaps传递给Reference Monitor类,并尝试读取内容,则会出现空指针错误。
非常感谢你。
答案 0 :(得分:0)
您尚未初始化HashMaps。它们为null,因为您从未创建它们。
HashMap<String, int[]> map = new HashMap<String, int[]>();
答案 1 :(得分:0)
问题在于:
class ReferenceMonitor{
ReferenceMonior(HashMap<String, int[]> subject, HashMap<String, int[]> object) {
//these three lines are the culprit
SecureSystem ss = new SecureSystem();
ss.subject.put("a", new int{1,2});
ss.object.put("a", new int{3,4})
}
}
您将数据放在新subject
局部变量内的object
和SecureSystem ss
映射中,这些变量在构造函数调用完成后将无法使用。您应该将数据放在subject
和object
参数中,这样它们的内容也会被修改:
class ReferenceMonitor{
ReferenceMonior(HashMap<String, int[]> subject, HashMap<String, int[]> object) {
//code fixed
//also, there's no need to create a new SecureSystem instance
subject.put("a", new int[] {1,2});
object.put("b", new int[] {3,4});
}
}
此代码甚至可以增强来代替传递SecureSystem
对象引用:
class ReferenceMonitor{
ReferenceMonior(SecureSystem secureSystem) {
secureSystem.getSubject().put("a", new int[] {1,2});
secureSystem.getObject().put("b", new int[] {3,4});
}
}
答案 2 :(得分:-1)
您是否在任何地方使用new()
来初始化您的Hashmaps?如果没有。有你的答案。
你想要的是
class ReferenceMonitor{
ReferenceMonior(HashMap<String, int[]> subject, HashMap<String, int[]> object) {
SecureSystem ss = new SecureSystem();
ss.subject=subject;
ss.object=object;
ss.subject.put("a", new int{1,2});
ss.object.put("a", new int{3,4})
}
}
此外,这是糟糕的代码。
1)您应该考虑使用patterns之类的builder pattern
2)您对公共数据成员的使用违反了OOP的信息隐藏原则,被认为是不好的风格。请使用setter方法。