我有一段代码,我必须知道如何分配内存
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());
}
答案 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对象不同。