Что я делаю неправильно с условными операторами? [дубликат]

Этот вопрос уже имеет ответ здесь:

У меня есть следующий код:

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, смешанный режим, совместно используя)

9
задан Jakob Cosoroaba 6 January 2010 в 00:48
поделиться

4 ответа

Тернарный оператор является выражением и вычисляет одно из двух передаваемых ему значений.

С System.out. println не возвращает значение, его нельзя поместить внутрь тернарного оператора.

Необходимо записать System.out.println(isTrue ? "true" : "false");

20
ответ дан 4 December 2019 в 06:35
поделиться

На самом деле в этом утверждении две ошибки.

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 в начале строки.

.
8
ответ дан 4 December 2019 в 06:35
поделиться

давно не использовали Java, но я бы использовал этот синтаксис для решения проблемы:

public class boolq {
    public static void main(String[] args) {
        boolean isTrue = true;
        System.out.println(isTrue ? "true" : "false");       
    }
}
4
ответ дан 4 December 2019 в 06:35
поделиться

Вы пытаетесь использовать выражение в контексте оператора. Попробуйте:

public class boolq { 
    public static void main(String[] args) { 
        boolean isTrue = true; 
        if (isTrue) {
            System.out.println("true");
        } else {
            System.out.println("false");
        }
    } 
}
3
ответ дан 4 December 2019 в 06:35
поделиться
Другие вопросы по тегам:

Похожие вопросы: