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

コードは null ポインター例外を与えています。オブジェクトの参照をメソッドに与えました。そこに新しいオブジェクトを割り当て、メソッドを書き直すと名前を設定すると、すべてが期待どおりに機能します。

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 に答える