2013-10-13 2 views
7

Warum ist mein Compiler mir zu sagen:Switch-Anweisung mit Boolean funktioniert nicht?

Inkompatible Typen:

Required: Boolean

Gefunden: Int

unter case 0 & Fall 1


Zum Beispiel:

public void test(boolean isOn){ 
    switch (isOn){ 
     case 0: 
      if (isOn){ 
       System.out.println("its on"); 
      } 
      break; 
     case 1: 
      if (!isOn){ 
       System.out.println("its off"); 
      } 
      break; 
     default: 
      System.out.println("I don't know!"); 
    } 

}

Treiberklasse:

Club me = new Club(); 
me.test(true); 
+0

Ihre 'Schalter' und' if' redundant sind. – SLaks

+0

Ich weiß es nur, damit ich zumindest sehen kann, wie es funktioniert, ich lerne nur das –

+1

Boolesche Werte - 'true',' false', 'FILE_NOT_FOUND'! In Java kann ein 'boolean' nur zwei Werte haben - true und false. Ihr Standardfall wird nie erreicht werden (und die meisten Leute würden wahrscheinlich eine "if" -Anweisung verwenden). Jetzt kann 'Boolean' (beachten Sie das Kapital' 'B'') 'null' sein (an diesem Punkt" Ich weiß nicht, "macht Sinn), aber Sie verwenden das hier nicht ... –

Antwort

1

Da der Fehler eindeutig fest, Zahlen sind nicht booleans.

Sie möchten true und false.

11

Sie schalten boolean ein und Ihre Gehäuse verwenden int Typen. Aber auch wenn Sie Ihre Fälle ändern, um boolean Typen zu haben, würde das nicht funktionieren. Sie können den Typ boolean nicht einschalten. Und das würde keinen Sinn machen, wie ein if-else mit einfacher wäre sowieso:

if (isOn) { 
    System.out.println("its on"); 
} else { 
    System.out.println("its off"); 
} 

Hinweis, dass es keinen "I don't know!" Fall. Ein boolean Typ kann entweder true oder false Wert haben. Dies ist ein weiterer Grund, warum switch-case nicht für boolean Typ ist. Es gibt keinen Standardfall.

Sie können auch zu einer einzigen Anweisung kondensieren durch einen bedingten Ausdruck mit:

public void test(boolean isOn) { 
    System.out.println(isOn ? "its on" : "its off"); 
} 
+0

Ich habe die ändert sich jetzt unter 'switch (isOn)' sein Sprichwort Gefunden: Boolean, Erforderlich: Char, Byte, short oder int –

+0

@someone Sie können 'boolean' Typ nicht einschalten, sondern nur' int' Typen, 'String', oder 'enum' Typen. –

+1

Das Einschalten von 'true' ist eigentlich nützlicher, als dass Sie es scheinen lassen. Go verwendet es die ganze Zeit https://code.google.com/p/go-wiki/wiki/Switch#Missing_expression –

2

switch (isOn): Schale boolean und mit int Fall will zum Beispiel case 0!

Nach dem JLS section 14.11: für eine switch (Expression) SwitchBlock:

Expression nur char, byte, short, int, Character, Byte, Short, Integer, String, or an enum type andere weise ein sein kann Kompilierung-Fehler auftritt.

gemäß der Spezifikation folgenden sind auch wahr sein muss:

  1. Jeder Fall konstanter Ausdruck mit einer switch-Anweisung auf den Typ des Schalters Expression assoziiert zuordenbar sein müssen.
  2. Keine der case Konstantenausdrücke, die mit einem Schalter verknüpft sind, können denselben Wert haben.
  3. Nr. switch Etikett ist null.
  4. Höchstens ein Standard-Label kann mit dem gleichen Schalter Anweisung

Daher schalten Ausdruck float, double oder boolean kann nicht in Verbindung gebracht werden. Um die Frage zu beantworten, warum ?: boolean true false sind sinnvolle Verwendung mit if-else, z. B. if(true) then do. Fließkommazahlen (float, double) sind keine guten Kandidaten für Schalter, da der exakte Vergleich oft durch Rundungsfehler unterbrochen wird. z.B. 0.11 - 0.1 == 0.01 ist falsch.

0

Dies ist nicht C++, wo 1 und 0 implizit in/von true und false konvertiert werden. Boolean einzuschalten ist auch eine Zeitverschwendung, selbst wenn du es tun könntest; Schreiben Sie einfach eine einfache if/else-Anweisung oder verwenden Sie das ? :-Konstrukt.

0

einfach die Boolesche Zahl von 1 und 0 konvertieren

public void test(boolean isOn){ 
    int trueOrFalse; 
    if(isOn == true){ 
     trueOrFalse = 1; 
    }else{ 
     trueOrFalse = 0; 
    } 
    switch (trueOrFalse){ 
     case 1: 
      if (isOn){ 
       System.out.println("its on"); 
      } 
      break; 
     case 0: 
      if (!isOn){ 
       System.out.println("its off"); 
      } 
      break; 
     default: 
      System.out.println("I don't know!"); 
    } 
} 
+0

ermutigen Sie nicht, Code wie folgt zu schreiben. – Raildex

0

In Java, schaltet nicht mit Booleschen arbeiten.

Akzeptierte Variablentypen sind: char, byte, short, int, String, Charakter, Byte, Short, Integer, Enum