Hello Guys:D 为什么我不能在没有运行时异常的情况下执行以下代码?怎么改写?我正在从C ++迁移,我可以很容易地做到这一点:D。
class MyJavaClass {
public static void main(String args[]) {
Dog bushui_RIP = new Dog();
Dog fellow = null;
bushui_RIP.bark(fellow);
fellow.bark();
}
}
class Dog {
public void bark(Dog buddy) {
buddy = this;
}
public void bark() {
System.out.println("I am barking!!!");
}
}
答案 0 :(得分:5)
fellow
为null
,因此没有可以bark
的对象。
答案 1 :(得分:5)
Dog fellow
是一个引用变量,但是它通过值传递给方法。
答案 2 :(得分:2)
Dog fellow = null;
你必须先将它初始化,然后才能使你的狗吠。
答案 3 :(得分:2)
将Dog fellow = null;
更改为Dog fellow = new Dog();
。
答案 4 :(得分:2)
问题是你的本地变量伙伴。当你试图调用它的bark()时,它为null。
当你调用bushui_RIP.bark(伙伴)时,它确实是一个引用传递,但引用本身作为值传递(如何)。所以你在你的树皮(狗)函数中分配一个局部变量伙伴而不接触原始的参考伙伴。
什么是树皮(狗)应该做什么?克隆这个并返回一个新的Dog实例,或者将它分配给引用?
答案 5 :(得分:2)
在Java中,您无法通过引用传递对象引用,就像在C ++中编写Dog **ppDog
一样。您可以将值(this
)作为返回值或字段传递给调用者。
或者,您可以使用“单元格模式”。首先,定义您的Cell<T>
类,该类包含对类型为T
的对象的引用:
class Cell<T> {
public T item;
Cell(T item) {
this.item = item;
}
}
然后,你可以写:
private void bark(Cell<Dog> buddy) {
buddy.item = this;
}
...
Dog bushui_RIP = new Dog();
Cell<Dog> fellow = Cell(null);
bushui_RIP.bark(fellow);
fellow.item.bark();
答案 6 :(得分:1)
另一个解决方法是将bark()
更改为静态。
public static void bark() {
System.out.println("I am barking!!!");
}
((Dog) null).bark();
// is the same as
Dog.bark();
我正在从C ++迁移,我可以轻松地从那里进行迁移
我认为你不会轻易地取消引用NULL指针而不会导致杀死你的应用程序的分段错误。