Этот вопрос уже имеет ответ здесь:
У меня есть следующий код:
public class boolq {
public static void main(String[] args) {
boolean isTrue = true;
isTrue ? System.out.println("true"): System.out.println("false");
}
}
когда я пытаюсь скомпилировать его, я получаю это:
Исключение в потоке "основной" java.lang. Ошибка: Нерешенные проблемы компиляции:
Синтаксическая ошибка на маркере""; утверждайте ожидаемый после этого маркера
Несоответствие типов: не может преобразовать от пустоты до булевской переменной
в boolq.main (boolq.java:3)
что я делаю неправильно?
Java - версия
версия "1.6.0_15" Java
Java(TM) SE Runtime Environment (создают 1.6.0_15-b03),
Java HotSpot(TM) Client VM (сборка 14.1-b02, смешанный режим, совместно используя)
Тернарный оператор является выражением и вычисляет одно из двух передаваемых ему значений.
С System.out. println
не возвращает значение, его нельзя поместить внутрь тернарного оператора.
Необходимо записать System.out.println(isTrue ? "true" : "false");
На самом деле в этом утверждении две ошибки.
isTrue ? System.out.println("true"): System.out.println("false");
Как указывает @Slaks, оператор @Slaks требует, чтобы выражения второго и третьего операндов имели неотвратимый тип. Это объясняет сообщение
"Type mismatch: cannot convert from void to boolean"
Но сообщение
"Syntax error on token ";", assert expected after this token"
говорит о чем-то другом!!! Это происходит потому, что не все выражения могут быть использованы в качестве выражений в Java. Короче говоря, это все равно будет ошибкой, даже после того, как вы заменили вызовы печати на неотвратимые выражения.
Применяемая часть грамматики Java говорит следующее:
ExpressionStatement:
StatementExpression ;
StatementExpression:
Assignment
PreIncrementExpression
PreDecrementExpression
PostIncrementExpression
PostDecrementExpression
MethodInvocation
ClassInstanceCreationExpression
Обратите внимание, что тернарного выражения нет в списке. Тогда синтаксический анализатор предполагает (неверно), что вы пытались написать AssertStatement, и говорит, что вы пропустили ключевое слово assert
в начале строки.
давно не использовали Java, но я бы использовал этот синтаксис для решения проблемы:
public class boolq {
public static void main(String[] args) {
boolean isTrue = true;
System.out.println(isTrue ? "true" : "false");
}
}
Вы пытаетесь использовать выражение в контексте оператора. Попробуйте:
public class boolq {
public static void main(String[] args) {
boolean isTrue = true;
if (isTrue) {
System.out.println("true");
} else {
System.out.println("false");
}
}
}