我有以下代码:
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,混合模式,共享)
答案 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));