9 Stimmen

Was mache ich bei bedingten Operatoren falsch?

Ich habe den folgenden Code:

public class boolq {
    public static void main(String[] args) {
        boolean isTrue = true;
        isTrue ? System.out.println("true"): System.out.println("false");       
    }
}

Wenn ich versuche, es zu kompilieren, erhalte ich Folgendes:

Ausnahme im Thread "main" java.lang.Error: Ungelöste Kompilierungsprobleme:

Syntaxfehler beim Token ";", Assert wird nach diesem Token erwartet

Typ-Fehlanpassung: kann nicht von void nach boolean konvertieren

at boolq.main(boolq.java:3)

Was mache ich falsch?

java -version

java version "1.6.0_15"

Java(TM) SE-Laufzeitumgebung (Build 1.6.0_15-b03)

Java HotSpot(TM) Client VM (Build 14.1-b02, gemischter Modus, gemeinsame Nutzung)

21voto

SLaks Punkte 832502

Der ternäre Operator ist ein Ausdruck und wertet einen der beiden Werte aus, die Sie ihm übergeben.

Seit System.out.println keinen Wert zurückgibt, können Sie ihn nicht in den ternären Operator einfügen.

Sie müssen Folgendes schreiben System.out.println(isTrue ? "true" : "false");

9voto

Stephen C Punkte 665668

In dieser Aussage stecken eigentlich zwei Fehler.

isTrue ? System.out.println("true"): System.out.println("false");

Wie @Slaks anmerkt, erfordert der ternäre '?'-Operator, dass der zweite und dritte Operandenausdruck einen nicht-leeren Typ haben. Das erklärt die Meldung

"Type mismatch: kann nicht von void nach boolean konvertieren".

Aber die Botschaft

"Syntaxfehler beim Token ";", Assert wird nach diesem Token erwartet"

sagt etwas anderes!! Das liegt daran, dass in Java nicht alle Ausdrücke als Anweisungen verwendet werden können. Kurz gesagt, dies wäre immer noch ein Fehler, auch nachdem Sie die println-Aufrufe durch nicht-leere Ausdrücke ersetzt haben.

Der anwendbare Teil der Java-Grammatik besagt Folgendes:

ExpressionStatement:
    StatementExpression ;

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression

Beachten Sie, dass der ternäre Ausdruck nicht in der Liste enthalten ist. Der Parser geht dann (fälschlicherweise) davon aus, dass Sie versucht haben, eine AssertStatement zu schreiben, und sagt, dass Sie das assert Schlüsselwort am Anfang der Zeile.

4voto

Marek Karbarz Punkte 28282

Ich habe Java schon eine Weile nicht mehr benutzt, aber ich würde diese Syntax verwenden, um das Problem zu lösen:

public class boolq {
    public static void main(String[] args) {
        boolean isTrue = true;
        System.out.println(isTrue ? "true" : "false");       
    }
}

3voto

Greg Hewgill Punkte 882617

Sie versuchen, einen Ausdruck im Kontext einer Aussage zu verwenden. Versuchen Sie es:

public class boolq { 
    public static void main(String[] args) { 
        boolean isTrue = true; 
        if (isTrue) {
            System.out.println("true");
        } else {
            System.out.println("false");
        }
    } 
}

1voto

nadZuha Punkte 11

Wenn Sie es immer noch mit "short if" machen wollen, dann versuchen Sie es so:

boolean isTrue;     
PrintStream ps = isTrue ? System.out : System.err;
ps.println(String.valueOf(isTrue));

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X