java中的空引用

时间:2012-12-24 05:34:11

标签: java

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

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

3 个答案:

答案 0 :(得分: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;
}

答案 1 :(得分:2)

您正在使用null作为输入调用addReference()方法,因此..没有按引用传递,并且在addReference()中新分配了ConsumerName,其范围将仅保留在方法中。因此,您修改代码以返回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();
}
}

答案 2 :(得分:1)

永远记住,java使用pass-by-value。当你这样做

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

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