2010-01-06 50 views
8

我有以下代码:我在做什么错误的条件操作符?

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

当我尝试编译它,我得到这个:

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)

我究竟做错了什么?

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)

回答

20

三元运算符是一个表达式,并评估了两人一个您传递给它的值。

由于System.out.println没有返回值,所以不能将其放入三元运算符中。

你需要写System.out.println(isTrue ? "true" : "false");

+1

常见错误,这是三元操作 - http://en.wikipedia.org/wiki/Ternary_operation – jball 2010-01-06 00:54:34

+0

作品像魅力 – 2010-01-06 00:54:46

+0

@jball:你是对的;三级意味着三级。 – SLaks 2010-01-06 00:55:55

3

您正在尝试在语句上下文中使用表达式。尝试:

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

没有使用Java的一段时间,但我会用这个语法来解决这个问题:

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

其实有本声明两个错误。

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

正如@Slaks指出的,三元'?'运算符要求第二个和第三个操作数表达式具有非空类型。这

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

说着什么不同解释的消息

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

但该消息!发生这种情况是因为并非所有表达式都可以用作Java中的语句。总之,即使在用非空表达式替换println调用之后,这仍然是一个错误。

的Java语法适用部分这样说:

ExpressionStatement: 
    StatementExpression ; 

StatementExpression: 
    Assignment 
    PreIncrementExpression 
    PreDecrementExpression 
    PostIncrementExpression 
    PostDecrementExpression 
    MethodInvocation 
    ClassInstanceCreationExpression 

注意,三元表达不在列表中。解析器然后假设(错误地)您正在尝试编写一个AssertStatement,并且说您在行的开头忽略了关键字assert

1

如果您仍然想这样做,使用“总之如果”,那么试试这个:

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