-3
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 传递给 ReferenceMonitor 类,并尝试读取内容,我会得到 NullPointerError。

太感谢了。

4

3 回答 3

0

您尚未初始化 HashMap。它们为空,因为您从未创建它们。

HashMap<String, int[]> map = new HashMap<String, int[]>();

于 2013-09-13T21:31:54.500 回答
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})
    }
}

您将数据放在新的局部变量中的subjectobject映射中SecureSystem ss,在构造函数调用完成后将无法使用。您应该将数据放在subjectandobject参数中,以便它们的内容也将被修改:

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});
    }
}

另外,请注意Java 不是通过引用传递的

于 2013-09-13T22:44:19.937 回答
-1

您是否在任何地方使用 anew()来初始化您的 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)您应该考虑使用诸如构建器模式之类的模式

2) 您对公共数据成员的使用违反了 OOP 的信息隐藏原则,被认为是不良风格。请使用setter方法。

于 2013-09-13T21:32:23.980 回答