在循环中返回:Java中的错误?

时间:2017-02-08 12:51:58

标签: java

在Python中编码时,我常常通过在循环中插入return来破坏函数/方法,例如当达到条件并且我想返回值时。我注意到如果我在Java中执行此操作,IDE(在本例中为Eclipse)似乎无法识别return命令。例如:

protected Node getTrueParent() {
    for (Edge e : this.edges) {
        if (e.getNode2() == this && (!e.isPseudo())) {
            Node parent = e.getNode1();
            return parent;
        }
    }
}

Eclipse指出"此方法必须返回Node" 类型的结果。 我在做什么不对?此外,parentfor循环中声明,因此我无法将其返回到循环之外。一种方法是在开始时(即在循环之外)声明parent,但这对我来说是非常草率的。写这个的正确方法是什么?

7 个答案:

答案 0 :(得分:7)

当你在循环中找不到结果时,你错过了return

protected Node getTrueParent() {
    for (Edge e : this.edges) {
        if (e.getNode2() == this && (!e.isPseudo())) {
            Node parent = e.getNode1();
            return parent;
        }
    }
    return null; // ADD THIS
}

如果您完全确定不会发生这种情况,并且您认为此处不应该返回,请抛出异常:

protected Node getTrueParent() {
    for (Edge e : this.edges) {
        if (e.getNode2() == this && (!e.isPseudo())) {
            Node parent = e.getNode1();
            return parent;
        }
    }
    throw new IllegalStateException("Somebody broke the data. Send Help!");
}

答案 1 :(得分:3)

如果循环结束而没有返回任何内容,则必须返回一些东西。

例如:

protected Node getTrueParent() {
    for (Edge e : this.edges) {
        if (e.getNode2() == this && (!e.isPseudo())) {
            return e.getNode1();
        }
    }
    return null;
}

答案 2 :(得分:1)

如果e.getNode2()永远不是this,它会返回什么?整个方法中的所有路径必须最终返回一些东西。

答案 3 :(得分:1)

bcz你已经在if条件中包装了返回,因此编译器正在抱怨。

更改您的代码如下

    protected Node getTrueParent() {
        for (Edge e : this.edges) {
            if (e.getNode2() == this && (!e.isPseudo())) {
                Node parent = e.getNode1();
                return parent;
            }

        }
          return null;
    }

答案 4 :(得分:1)

如果if语句没有成功,你忘了回来!

protected Node getTrueParent() {
    for (Edge e : this.edges) {
        if (e.getNode2() == this && (!e.isPseudo())) {
            Node parent = e.getNode1();
            return parent;
        }
    }
    return null; // if you dont find something
}

答案 5 :(得分:1)

您的Node课程应对您的Edge列表进行空检查。此外,您应该为实例字段提供访问器/更改器。

import java.util.List;

public class Node {
    private List<Edge> edges = null;

    public List<Edge> getEdges() {
        return edges;
    }

    public void setEdges(List<Edge> edges) {
        this.edges = edges;
    }

    protected Node getTrueParent() {
        if (getEdges() != null && !getEdges().isEmpty()) {
            for (Edge e : getEdges()) {
                if (e != null && e.getNode2() == this && !e.isPseudo()) {
                    return e.getNode1();
                }
            }
        }
        return null;
    }
}

答案 6 :(得分:1)

protected Node getTrueParent() {
    Node parent=null;
    for (Edge e : this.edges) {
        if (e.getNode2() == this && (!e.isPseudo())) {
            Node parent = e.getNode1();
            return parent;
        }
    }
    return parent;
}