3

我有一段代码,我必须知道如何分配内存

public class Demo {

public void checkNullReference(){
    ConsumerName name =  null;
    addReference(name);
    System.out.println(name.getConsumerName());
}

public void addReference(ConsumerName name){
    name = new ConsumerName();
    name.setConsumerName("KRISHNA");
}

public static void main(String []args){
    Demo demo = new Demo();
    demo.checkNullReference();
}
}

代码给出了空指针异常,我已经给方法一个对象的引用,并且我正在为它分配新对象并设置名称,如果我重写方法,那么一切都按预期工作。

public void checkNullReference(){
    ConsumerName name =  new ConsumerName();
    addReference(name);
    System.out.println(name.getConsumerName());
}
4

3 回答 3

8

您不能从被调用方法更改调用方法中的引用。因此,使用此代码:

public void checkNullReference(){
    ConsumerName name =  null;
    addReference(name);
    System.out.println(name.getConsumerName());
}

name仍然会null在调用 之后addReference(name),不管addReference它的正式参数是什么。

您可以重新设计addReference返回. ConsumerName当您使用它时,您可以删除该参数,因为它被忽略了。结果可能是:

public void checkNullReference(){
    ConsumerName name =  addReference();
    System.out.println(name.getConsumerName());
}

public ConsumerName addReference(){
    ConsumerName name = new ConsumerName();
    name.setConsumerName("KRISHNA");
    return name;
}
于 2012-12-24T05:35:40.047 回答
2

您正在使用 null 作为输入调用 addReference() 方法,因此.. 没有通过引用发生传递,并且 ConsumerName 是在 addReference() 中新分配的,其范围将仅保留在该方法中。因此,您修改代码以返回 ConsumerName 的新实例。

public class Demo {

public void checkNullReference(){
    ConsumerName name =  null;
    name = addReference(name);
    System.out.println(name.getConsumerName());
}

public ConsumerName addReference(ConsumerName name){
    name = new ConsumerName();
    name.setConsumerName("KRISHNA");
    return name ;
}

public static void main(String []args){
    Demo demo = new Demo();
    demo.checkNullReference();
}
}
于 2012-12-24T05:41:23.220 回答
1

永远记住,java 使用按值传递。当你这样做

name = new ConsumerName();
name.setConsumerName("KRISHNA");

它只是简单地创建一个位于 addReference 函数堆栈内的新本地对象。因此,一旦函数返回,您就丢失了该对象。换句话说,checkNullReference 中的 ConsumerName 对象与 AddReference 中的 ConsumerName 对象不同。

于 2012-12-24T05:38:53.863 回答