2010-01-06 11 views
8

Mam następujący kod:Co robię źle z operatorami warunkowymi?

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

gdy próbuję go skompilować i uzyskać w ten sposób:

Exception in thread "main" java.lang.Error: Unresolved compilation problems:

Syntax error on token ";", assert expected after this token

Type mismatch: cannot convert from void to boolean

at boolq.main(boolq.java:3)

co robię źle?

java -version

java version "1.6.0_15"

Java(TM) SE Runtime Environment (build 1.6.0_15-b03)

Java HotSpot(TM) Client VM (build 14.1-b02, mixed mode, sharing)

Odpowiedz

20

Operator trójargumentowy jest wyrazem i ocenia jednego z dwóch wartości, które do niego przechodzisz.

Ponieważ System.out.println nie zwraca wartości, nie można jej umieścić w trójskładnikowym operatorze.

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

+1

Częstym błędem, to trójoperandowy operacja - http://en.wikipedia.org/wiki/Ternary_operation – jball

+0

prace jak amulet –

+0

@jball: Masz rację; trzeciorzędny oznacza trzeci rząd. – SLaks

3

Próbujesz użyć wyrażenia w kontekście instrukcji. Spróbuj:

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

nie była używana Java na jakiś czas, ale chciałbym skorzystać z tej składni, aby rozwiązać ten problem:

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

Są to właściwie dwa błędy w tym oświadczeniu.

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

Jak wskazuje @Slaks, trójskładnik "?" operator wymaga, aby wyrażenie drugiego i trzeciego argumentu operacji było typu bezwolnego. To wyjaśnia komunikat

"Type mismatch: cannot convert from void to boolean".

ale wiadomość

"Syntax error on token ";", assert expected after this token"

mówi coś innego !! Dzieje się tak, ponieważ nie wszystkie wyrażenia mogą być używane jako instrukcje w Javie. W skrócie, byłby to nadal błąd, nawet po zastąpieniu wywołań println wyrażeń niewidocznych.

Obowiązująca częścią gramatyki Java mówi to:

ExpressionStatement: 
    StatementExpression ; 

StatementExpression: 
    Assignment 
    PreIncrementExpression 
    PreDecrementExpression 
    PostIncrementExpression 
    PostDecrementExpression 
    MethodInvocation 
    ClassInstanceCreationExpression 

Zauważ, że trójskładnikowych wyrażenie nie jest na liście. Parser zakłada (niepoprawnie), że próbujesz napisać AssertStatement i mówi, że na początku linii pominięto słowo kluczowe assert.

1

Jeśli nadal chcesz zrobić to za pomocą „short jeśli”, więc spróbuj tego:

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