我对条件运算符做错了什么?

时间:2010-01-06 00:48:07

标签: java boolean

我有以下代码:

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

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

  

线程“main”中的异常java.lang.Error:未解决的编译问题:

     

令牌“;”上的语法错误,在此令牌后预期断言

     

类型不匹配:无法从void转换为boolean

     

在boolq.main(boolq.java:3)

我做错了什么?

  

java -version

     

java版“1.6.0_15”

     

Java(TM)SE运行时环境(版本1.6.0_15-b03)

     

Java HotSpot(TM)客户端VM(版本14.1-b02,混合模式,共享)

5 个答案:

答案 0 :(得分:20)

三元运算符是一个表达式,并计算为传递给它的两个值之一。

由于System.out.println没有返回值,因此您无法将其放在三元运算符中。

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

答案 1 :(得分:8)

此声明中实际上有两个错误。

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

@Slaks指出,三元'?'运算符要求第二个和第三个操作数表达式具有非void类型。这解释了消息

  

“类型不匹配:无法从void转换为布尔值”。

但消息

  

“令牌上的语法错误”;“,在此令牌后预期断言”

说的不同!!发生这种情况是因为并非所有表达式都可以用作Java中的语句。简而言之,即使用非void表达式替换了println调用,这仍然是一个错误。

Java语法的适用部分说明了这一点:

ExpressionStatement:
    StatementExpression ;

StatementExpression:
    Assignment
    PreIncrementExpression
    PreDecrementExpression
    PostIncrementExpression
    PostDecrementExpression
    MethodInvocation
    ClassInstanceCreationExpression

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

答案 2 :(得分:4)

暂时没有使用过Java,但我会使用这种语法来解决问题:

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

答案 3 :(得分: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 :(得分:1)

如果您仍想使用“short if”进行操作,请尝试以下操作:

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