2016-07-09 15 views
3

Ich bin neu in Java und ich lerne es selbst. Ich habe ein Problem gefunden, als ich die Methode überladen versuchte. Dies ist der CodeZurück in der Methode überladen

public static void main(String[] args) { 
     calculateScore(); 
     calculateScore(500); 
     calculateScore("Duy", 600); 
     calcFeetAndInchesToCentimetres(100, 3.5); 
     calcFeetAndInchesToCentimetres(100*12 + 3.5); 
    } 

public static double calcFeetAndInchesToCentimetres(double feet, double inches) { 
     if (feet >= 0 && inches >= 0 && inches <= 12) { 
      double footToInches = feet * 12; 
      double centimetres = (inches + footToInches) * 2.54; 
      System.out.println("The value in centimetres is " + centimetres + " cm."); 
      return centimetres; 
     } else { 
      return -1; 
     } 
    } 

    public static double calcFeetAndInchesToCentimetres(double inches) { 
     if (inches >= 0){ 
      double inchesToFeet = inches/12; 
      double inchesRemain = inches - (inchesToFeet * 12); 
      calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain); 
      return 0; 
     } else { 
      return -1; 
     } 

Mein Problem ist, wenn ich die return 0 aus der zweiten Methode nehmen, sagt der Debugger „missing return-Anweisung“. Dann habe ich versucht, return calcFeetAndInchesToCentimetres(inches); setzen, es funktioniert, aber das Programm läuft für viele tausend Mal.

Dann setze ich return 0 und alles ist in Ordnung. Aber ich verstehe nicht, warum ich die return calcFeetAndInchesToCentimetres(inches); nicht setzen kann und warum brauche ich eine return-Anweisung, wenn die obige Methode (mit 2 Parametern) es bereits hatte. Und wenn ich den Wert von Zentimetern konvertieren lassen möchte, wenn ich die zweite Methode (nur mit dem Parameter "Zoll") ausführe, was muss ich tun?

Eine andere Sache, die ich, dass in diesem blockcode

double inchesToFeet = inches/12; 
     double inchesRemain = inches - (inchesToFeet * 12); 
     calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain); 

die inchesRemain wird 0 realisiert haben? Aber die Methode funktioniert sehr gut. Wenn ich inchesToFeet = inches % 12 ändere, zeigt es einfach nichts. Warum?

Antwort

5

Es sollte einfach sein:

public static double calcFeetAndInchesToCentimetres(double inches) { 
    if (inches >= 0){ 
     double inchesToFeet = inches/12; 
     double inchesRemain = inches - (inchesToFeet * 12); 
     return calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain); 
    } else { 
     return -1; 
    } 
} 

Sie sagten, Sie return calcFeetAndInchesToCentimetres(inches); versucht haben, aber das ist nur Ihre Methode rekursiv aufrufen und es recurses für immer, da es keine Stoppzustand ist.

+0

Die Rückgabe ist der Wert in der Methode richtig? Ich meine, wenn ich nicht zurück gebe was dann passiert? Weil ich nur zurückgebe, wenn ich die in der Methode deklarierte Variable benutzen muss, nachdem ich sie –

+1

genannt habe Wow, das ist ein ziemlich großes Missverständnis darüber, was die Rückkehr ist. Lassen Sie 'void' Methoden beiseite,' return' ist das Wichtigste in einer Methode, und es ist sicherlich nicht für den Zugriff auf Variablen innerhalb der Methode. Der eigentliche Zweck einer Funktion besteht darin, eine Liste (möglicherweise leer) von Parametern zu nehmen und abhängig davon einen Wert zurückzugeben. Ohne eine return-Anweisung können Sie nur "void" -Methoden schreiben, die ** stopfen und nicht ** computing ** -Stücke sind. Sie sollten wirklich über Funktionen/Methoden lesen, denn Sie können sich keine Missverständnisse über diese Begriffe leisten. – Dici

+0

Können Sie das bitte genauer erklären? Und kannst du mir ein Buch für die Java-Programmierung vorschlagen? Ich bin vietnamesisch und das gesamte Web, das ich durchsucht habe, sagt nur, dass die 'Rückkehr' verwendet wird, wenn wir die Methode brauchen, um die Information zu behalten und sie zurückzugeben. Und ich verstehe nicht, warum "zurückgeben" die Methode erneut aufrufen wird (in meinem Code)? –

3

Beim Überladen der Methode haben Sie zwei verschiedene Methoden.

  1. calcFeetAndInchesToCentimetres, die ein einziges Argument
  2. calcFeetAndInchesToCentimetres nimmt die zwei Argumente

Jetzt nimmt, wenn Sie anrufen calcFeetAndInchesToCentimetres(inches); Sie die eine rufen, die ein einziges Argument. Wenn du das von innen heraus nennst, wird es sich weiterhin unendlich oft nennen. Dies ist der Fehler, den Sie sehen.

Wenn Sie das durch return calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain); ersetzen, wird das die andere Methode aufrufen - die, die zwei Argumente benötigt. Das wollen Sie eigentlich machen.

Festgelegte Version:

public static double calcFeetAndInchesToCentimetres(double inches) { 
    if (inches >= 0){ 
     double inchesToFeet = inches/12; 
     double inchesRemain = inches - (inchesToFeet * 12); 
     return calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain); 
    } else { 
     return -1; 
    } 
} 
0
public static void main(String[] args) { 
    calculateScore(); 
    calculateScore(500); 
    calculateScore("Duy", 600); 
    calcFeetAndInchesToCentimetres(100, 3.5); 
    calcFeetAndInchesToCentimetres(100*12 + 3.5); 
} 

public static double calcFeetAndInchesToCentimetres(double feet, double inches) { 
    if (feet >= 0 && inches >= 0 && inches <= 12) { 
     double footToInches = feet * 12; 
     double centimetres = (inches + footToInches) * 2.54; 
     System.out.println("The value in centimetres is " + centimetres + " cm."); 
     return centimetres; 
    } else { 
     return -1; 
    } 
} 
public static double calcFeetAndInchesToCentimetres(double inches) { 
    if (inches >= 0){ 
     double inchesToFeet = inches/12; 
     double inchesRemain = inches - (inchesToFeet * 12); 
     calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain); 
     return 0; //Here 
    } else { 
     return -1; 
    } 

Wenn Sie entfernen return 0 es zeigt return-Anweisung fehlt, weil Sie in einer if-else-Schleife sind. Nehmen wir an, Ihre Eingabe Zoll ist kleiner als 0 dann wird es gehen Sie den Else Teil und geben Sie die -1 .. aber wenn die Zoll inputed sind mehr als 0 dann wird es auf die if-Bedingung gehen und wenn es das Ende der erreichen wird Wenn die Anweisung dann wäre, gäbe es nichts, was für eine if-else-Bedingung zurückkehren würde, wenn if und sonst etwas zurückgeben sollte.

Andere Möglichkeit, um dies zu umgehen ist eine lokale Variable aus der If-else-Bedingung zu machen und zurückzukehren, wenn nach dem else Teil getan wird. Auf diese Weise Wetter geht es, wenn oder sonst Teil des Codes beide Male dort Geben Sie einen Wert für diese lokale Variable ein, die zurückgegeben werden soll.

Jetzt für zweiten Teil Ihrer Frage: Ihr Code aussehen

line 1 public static double calcFeetAndInchesToCentimetres(double inches) { 

Linie 2 if (inches >= 0){ Linie 3 double inchesToFeet = inches/12; Linie 4 double inchesRemain = inches - (inchesToFeet * 12); Linie 5 calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain); Linie 6 return calcFeetAndInchesToCentimetres(inches); } else { return -1; }

So in dieser Fall du rufst die selbe Methode immer wieder selbst an. Du fängst von Zeile 1 bis Zeile 6 an dann rufst du die selbe Methode an und die e xecution beginnt wieder und Linie 1 wird bis Zeile 6 und wieder Linie 1 immer und immer wieder ausgeführt werden, bis alle Speicher und ein Stackoverflow occours verloren ..

Beste praktizierte Code kann wie folgt aussehen:

public static double calcFeetAndInchesToCentimetres(double feet, double inches) { 
    double centimetres = 0.0; 
    if (feet >= 0 && inches >= 0 && inches <= 12) { 
     double footToInches = feet * 12; 
     centimetres = (inches + footToInches) * 2.54; 
     System.out.println("The value in centimetres is " + centimetres + " cm."); 
    } else { 
     centimetres = -1; 
    } 
    return centimetres; 
} 


public static double calcFeetAndInchesToCentimetres(double inches) { 
    double centimeters = 0; 
    if (inches >= 0) { 
     double inchesToFeet = inches/12; 
     double inchesRemain = inches - (inchesToFeet * 12); 
     centimeters = calcFeetAndInchesToCentimetres(inchesToFeet, inchesRemain); 

    } else { 
     centimeters = -1; 
    } 
    return centimeters; //Here 
} 
+0

Ich glaube nicht, dass eine einzelne Return-Anweisung eine bessere Praxis ist als mehrere Return-Statements, tatsächlich bevorzuge ich die erste in den meisten Fällen Endgültige Variablen machen den Code klarer als Variablen, die mehrfach zugewiesen sind – Dici

+0

Das bedeutet, dass ich nicht gezwungen bin, in jedem if und else Blockcode eine Rückgabe zu machen? –

+0

@Dici Das hängt von individuellen Codierungsverfahren ab. Es gibt viele Bedingungen, unter denen der Code lang ist, und wenn wir mehrere Return-Anweisungen haben, gibt es Zeiten, in denen wir das vergessen, und wenn wir ausführen, denken wir, wo wir sind ging schief .. Warum gibt es nicht die erforderliche Ausgabe zurück. –