我有以下代码:
public class boolq {
public static void main(String[] args) {
boolean isTrue = true;
isTrue ? System.out.println("true"): System.out.println("false");
}
}
Run Code Online (Sandbox Code Playgroud)
当我尝试编译它时,我得到了这个:
线程"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,混合模式,共享)
SLa*_*aks 20
三元运算符是一个表达式,并计算传递给它的两个值之一.
由于System.out.println不返回值,因此无法将其置于三元运算符中.
你需要写 System.out.println(isTrue ? "true" : "false");
这个陈述中实际上有两个错误.
isTrue ? System.out.println("true"): System.out.println("false");
Run Code Online (Sandbox Code Playgroud)
正如@Slaks指出的那样,三元'?' 运算符要求第二个和第三个操作数表达式具有非void类型.这解释了这个消息
"类型不匹配:无法从void转换为boolean".
但是消息
"令牌上的语法错误";",在此令牌后预期断言"
说的不一样!! 发生这种情况是因为并非所有表达式都可以用作Java中的语句.简而言之,即使用非void表达式替换了println调用,这仍然是一个错误.
Java语法的适用部分说:
ExpressionStatement:
StatementExpression ;
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
Run Code Online (Sandbox Code Playgroud)
请注意,三元表达式不在列表中.解析器然后(错误地)假设您正在尝试编写AssertStatement,并且说您assert在行的开头省略了关键字.