2017-02-08 3 views
0

Bei der Codierung in Python verwende ich häufig Funktionen/Methoden durch Einfügen von return innerhalb von Schleifen, zum Beispiel, wenn eine Bedingung erreicht wurde und ich den Wert zurückgeben möchte. Ich habe bemerkt, dass, wenn ich dies in Java mache, die IDE (in diesem Fall Eclipse) den return Befehl nicht zu erkennen scheint. Zum Beispiel hier:Rückkehr in eine Schleife: Falsch in Java?

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

Eklipse weist darauf hin, dass „Diese Methode ein Ergebnis vom Typ Knoten zurückgeben muß“. Ist es falsch, was ich mache? Außerdem wird parent innerhalb der for Schleife deklariert, so dass ich es nicht außerhalb der Schleife zurückgeben kann. Ein Weg wäre, parent am Anfang zu deklarieren (d. H. Außerhalb der Schleife), aber das wäre ziemlich schlampig für mich zu lesen. Was ist ein richtiger Weg dies zu schreiben?

+1

Sie brauchen etwas zurück, wenn 'this.edges' leer ist, oder wenn' e.getNode2() == diese && (! E.isPseudo()) 'ist nie wahr. – marstran

+1

Der Grund, warum es in Python funktioniert, ist, weil es eine Rückkehr für Sie am Ende der Funktion einfügt, wie die vorhandenen Antworten zeigen –

Antwort

7

Sie vermissen eine return, wenn Sie das Ergebnis nicht in der Schleife finden.

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

Wenn Sie absolut sicher sind, sollte dies nicht passieren, und Sie denken, es keine Rückkehr hier sein sollte, werfen eine Ausnahme:

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!"); 
} 
+2

Sie können hinzufügen, dass Python Großzügigkeit hier macht, dass es den Benutzer nicht von sich selbst hindert, Ursache für schwer zu findende Bugs (wie eine fehlende return-Anweisung oder fehlende Ausnahme) –

+0

Nun, ich werde Ihren Kommentar tun lassen;) –

3

Sie müssen etwas zurückgeben, wenn die Schleife endet ohne alles zurückgeben.

Zum Beispiel:

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

Was wird es zurück, wenn e.getNode2() nie this ist? Alle Pfade innerhalb der Methode müssen am Ende etwas zurückgeben.

1

bcz Sie haben die Rückgabe in der if-Bedingung eingewickelt und daher beschwert sich der Compiler.

als Code ändern unten

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

     } 
      return null; 
    } 
1

Sie haben vergessen, wenn die if-Anweisung wahr nicht zurück kommen!

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 
} 
1

Ihre Node Klasse sollte für Ihre Edge Liste null-Kontrollen haben. Außerdem sollten Sie Accessoren/Mutatoren für Ihre Instanzfelder bereitstellen.

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; 
    } 
} 
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; 
} 
Verwandte Themen