这是一项家庭作业。作业不是在递归上它是在树结构上。我差不多已经完成了任务,但是我的移动方法让你的树恢复了。树结构由下面的类给出:
package lab12;
import java.io.Serializable;
public class Dog implements Serializable{
public Dog[] children;
public String name;
public Dog(String name)
{
this.name = name;
}
@Override
public String toString()
{
return name;
}
}
我很确定原因是返回null;语句与我的for循环结合使用。 for循环遍历不包含任何子节点的节点,因此返回null。这结束了方法并将null传递给我的程序,这给了我空指针异常。
我无法删除return null语句,否则它将无法编译,即使它将100%使用for循环返回。
public Dog findParent(Dog root, String name)
{
String top = "Spot";
if(top.equals(name))
{
System.out.println("No further records");
System.out.println("Goodbye.");
System.exit(0);
}
for(int i = 0; root.children != null && i < root.children.length; i++)
{
if(root.children[i].name.equals(name))
{
return root;
}
else
{
return findParent(root.children[i], name);
}
}
return null; //Compiler still requires a return here.
}
我觉得这必须是在非void递归方法中使用for循环的常见问题。有没有办法使编译器满意而又没有额外的返回null语句?
答案 0 :(得分:3)
您的代码无法运行。因为if和else子句都将返回。这会导致循环只执行索引0.您应该更改您的代码,如下所示:
public Dog findParent(Dog root, String name)
{
String top = "Spot";
if(top.equals(name))
{
System.out.println("No further records");
System.out.println("Goodbye.");
System.exit(0);
}
for(int i = 0; root.children != null && i < root.children.length; i++)
{
if(root.children[i].name.equals(name))
{
return root;
}
else
{
Dog parent = findParent(root.children[i], name);
if (parent != null)
return parent;
}
}
return null;
}
现在,您可以看到最后一个“返回null”是必要的。
在大多数情况下,编译器很聪明。如果它给出了警告,你应该考虑代码的错误而不是欺骗编译器以避免警告。
答案 1 :(得分:2)
如果不完全理解这个问题,我认为没有理由“return null”语句永远不会执行。也许你的其他陈述应该是:
return findParent(root.children[i], name);
此返回将确保一旦找到“父”,将返回其值。