java中的空引用

java中的空引用,java,Java,我有一段代码,我必须知道如何分配内存 public class Demo { public void checkNullReference(){ ConsumerName name = null; addReference(name); System.out.println(name.getConsumerName()); } public void addReference(ConsumerName name){ name = new ConsumerNa

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

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();
}
}
代码给出了空指针异常,我给了一个引用object to method,在那里我给它分配了新的对象,并设置了名称,如果我重写了这个方法,那么一切都会按预期进行

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

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

public void checkNullReference(){
    ConsumerName name =  null;
    addReference(name);
    System.out.println(name.getConsumerName());
}
调用
addReference(name)
后,
name
仍将为
null
,无论
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;
}

请记住,java使用按值传递。当你这样做的时候

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

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

您调用的AddReference()方法的输入为null。。没有通过引用进行传递,并且ConsumerName正在使用in 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();
}
}

跟我说:“Java总是按值调用”。这意味着对参数的重新赋值不会影响调用者“传递”的任何变量。如果对null对象调用方法,则会出现null指针异常。
name=new ConsumerName()
创建ConsumerName的对象,但其作用域为方法
addRef()
因此,当您尝试在menthod checknullref()中检索它的值时,它会引发空异常。。Java是按值传递的。:-)因为。。。它实际上是一个指针,通过值传递,并且在方法中将值赋给局部变量在该方法之外没有任何作用。是的,@Vamsi描述的方法似乎是正确的方法。我们可以省略一行作为ConsumerName=addReference(name);。我们必须存储该方法返回的引用这对我很有帮助:您正在使用null作为输入调用addReference()方法