2017-09-15 3 views
-1

Ich habe heute ein Programm mit meinen Schülern ausgeführt und wir kamen zu einer Methode, die sie aufforderte, bedingte Anweisungen zu erstellen, die den Benutzer am Wochentag nach einer Eingabe von 1 - 7, die Sonntag bis Samstag entsprechen, anruft.Warum hört meine Wenn-Kette nicht auf?

Ein Student kam mit dem unten stehenden Code, der "Donnerstag" druckt, aber es druckt auch die Else-Anweisung aus. Ich kann nicht herausfinden, warum es bei d == nicht aufhört. 5. Aber als ich die Methode änderte, um einen String zurückzugeben, und jede if-Anweisung einen String wie "Sunday" zurückgab, funktionierte es. Der Code ist unten. Warum stoppt das Programm nicht für die Void-Methode, sondern für die String-Methode?

public static void dayOfWeek(int d) //This did not stop at d == 5. 
    { 
     if (d == 1) 
     { 
      System.out.println("Sunday"); 
     } 
     if (d == 2) 
     { 
      System.out.println("Monday"); 
     } 
     if (d == 3) 
     { 
      System.out.println("Tuesday"); 
     } 
     if (d == 4) 
     { 
      System.out.println("Wednesday"); 
     } 
     if (d == 5) 
     { 
      System.out.println("Thursday"); 
     } 
     if (d == 6) 
     { 
      System.out.println("Friday"); 
     } 
     if (d == 7) 
     { 
      System.out.println("Saturday"); 
     } 
     else 
     { 
      System.out.println("Oops! Number must be between 1 and 7"); 
     } 
    } 

public static String dayOfWeek(int d) //This worked at d == 5. 
{ 
    if (d == 1) 
    { 
     return "Sunday"; 
    } 
    if (d == 2) 
    { 
     return "Monday"; 
    } 
    if (d == 3) 
    { 
     return "Tuesday"; 
    } 
    if (d == 4) 
    { 
     return "Wednesday"; 
    } 
    if (d == 5) 
    { 
     return "Thursday"; 
    } 
    if (d == 6) 
    { 
     return "Friday"; 
    } 
    if (d == 7) 
    { 
     return "Saturday"; 
    } 
    else 
    { 
     return "Oops! Number must be between 1 and 7"; 
    } 
} 
+0

Warum sollte es? Warum denkst du, dass "sonst" zu den anderen gehört, wenn auch nicht nur der letzte? – Tom

+2

In diesem Fall gibt es keine 'if-Kette'. Sie haben eine Reihe aufeinanderfolgender, aber unabhängiger ifs und schließlich und wenn mit einem else, das allein zu diesem finalen gehört. Also, was passiert, ist das erste, wenn es ausgeführt wird, egal was passiert, der zweite wird ausgeführt, egal was passiert, der dritte wird ausgeführt, und so weiter bis zum letzten, der eine andere und eine nicht übereinstimmende Bedingung hat sehe die Ausgabe des else. – pvg

+1

Das zweite Beispiel funktioniert nur wegen der 'return'-Anweisung, nicht weil die Methode' String' zurückgibt. aber wie @Tom gesagt hat, ist der 'else'-Block nur der letzten' if'-Anweisung zugeordnet. –

Antwort

0

Der Punkt ist, dass es einen Unterschied zwischen einem else if und if und, wenn in aufeinanderfolgenden conditionals verwendet. In Ihrer Situation

if (a) { .. } 
if (b) { .. } 
else { .. } 

die if (a) bedingte nicht in irgendeiner Weise zu if (b) bezogen. Beide Bedingungen werden unabhängig voneinander ausgewertet und ihr Körper wird entsprechend ausgeführt. Die Bedingung else ist also nur der zweiten Bedingung zugeordnet und wird ausgeführt, wenn bfalse ist, unabhängig davon, was zuvor ausgeführt wurde.

In jedem Fall, dass Sie besser einen String[] für diese Situation nutzen würde, zum Beispiel:

private static final String[] days = { "Sunday", "Monday" ... }; 

public static String dayOfWeek(int d) { 
    if (d >= 1 && d <= 7) 
    return days[d-1]; 
    else 
    throw new IllegalArgumentException("Day of the week out of bounds!"); 
} 
+0

mit einem Scheck gegen 'days.length', würde dies funktionieren, wenn es unweigerlich geändert wird, um die Tage der 10-tägigen französischen republikanischen Kalenderwoche zurückzugeben. – pvg

Verwandte Themen