2010-01-06 17 views
8

Tengo el siguiente código:¿Qué estoy haciendo mal con los operadores condicionales?

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

cuando intento compilar me sale esto:

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)

¿qué estoy haciendo mal?

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)

Respuesta

20

El operador ternario es una expresión, y evalúa a uno de los dos valores que le pasas.

Dado que System.out.println no devuelve un valor, no puede ponerlo dentro del operador ternario.

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

+1

error común, es la operación ternaria - http://en.wikipedia.org/wiki/Ternary_operation – jball

+0

obras como un amuleto –

+0

@jball: Tienes razón; terciario significa tercer orden. – SLaks

3

Está intentando usar una expresión en un contexto de instrucción. Proveedores:

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

no han utilizado Java desde hace tiempo, pero me gustaría utilizar esta sintaxis para resolver el problema:

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

En realidad, hay dos errores en este comunicado.

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

Como @Slaks señala, el ternario '?' el operador requiere que las expresiones del segundo y tercer operando tengan un tipo no nulo. Eso explica el mensaje

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

Pero el mensaje

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

está diciendo algo diferente !! Esto sucede porque no todas las expresiones se pueden usar como declaraciones en Java. En resumen, esto aún sería un error, incluso después de reemplazar las llamadas println con expresiones no válidas.

La parte aplicable de la gramática de Java dice esto:

ExpressionStatement: 
    StatementExpression ; 

StatementExpression: 
    Assignment 
    PreIncrementExpression 
    PreDecrementExpression 
    PostIncrementExpression 
    PostDecrementExpression 
    MethodInvocation 
    ClassInstanceCreationExpression 

en cuenta que la expresión ternaria no está en la lista. El analizador está asumiendo (incorrectamente) que estaba tratando de escribir un AssertStatement y diciendo que omitió la palabra clave assert al comienzo de la línea.

1

Si aún desea hacerlo utilizando "corta si", a fin de tratar esto:

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