2013-07-14 5 views
3

Netbeans говорит, что мой тернарный оператор не является заявлением. Как так?тернарный оператор не работает

int direction; 
direction = (Math.random() < 0.5) ? 0 : 1; // direction is either L or R (0 or 1) 
direction == 0 ? System.out.print('L') : System.out.print('R'); 

Я попробовал это, если/то/иначе коллега и она отлично работает:

int direction; 
direction = (Math.random() < 0.5) ? 0 : 1; // direction is either L or R (0 or 1) 
if(direction == 0){ 
    System.out.print('L'); 
} else { 
    System.out.print('R'); 
} 
+1

В Java 0 не имеет логического представления. Для этого могут использоваться только булевы выражения. – Kon

+0

Возможный дубликат [Почему этот метод не работает? Java ternary operator] (http://stackoverflow.com/questions/16876698/why-doesnt-this-method-work-java-ternary-operator) –

ответ

12

Операторы в тройном оператора должны быть не аннулируются. Им нужно что-то вернуть.

System.out.println(direction == 0 ? 'L' : 'R'); 
+0

ahhh это замечательно. Благодарю. –

+0

@ Kudla69: добро пожаловать! –

9

Тернарный оператор предназначен для оценки одного из двух выражений, а не для выполнения одного из двух утверждений. (Вызов функции может быть выражением, если функция объявлена ​​для возврата значения, однако System.out - это PrintStream, а PrintStream.print - это функция void.) Вы можете либо придерживаться структуры if...else за то, что вы пытаетесь сделать, либо вы может это сделать:

System.out.print(direction == 0 ? 'L' : 'R'); 

ПРИМЕЧАНИЕ: комментарий по @iamcreasy указывает немного неточностей в том, как я сформулировал вещи выше. Выражение может ничего не оценивать, поэтому я должен был сказать, что тернарный оператор оценивает один из двух выражений , а не void. Согласно Java Language Specification §15.25:

Это ошибка времени компиляции для второго или третьего выражения операнда быть вызовом метода пустот.

+0

+1 для получения первой информации. –

+1

Но согласно [JLS 14.8] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-14.html#jls-14.8) MethodInvocation является выражением выражения. Значит ли это, что выражение может возвращать пустоту? (В общем случае) –

+0

@iamcreasy - выражение действительно может быть недействительным (я бы не использовал «return void», потому что «возврат» имеет специфический технический смысл в JLS), но не в общих случаях. Согласно [JLS §15.1] (https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.1), результатом оценки выражения может быть переменная (аналогичная _lvalue_ в C) , значение или ничего (выражение void). Однако выражение void v "можно использовать только как выражение (§14.8), поскольку любой другой контекст, в котором может отображаться выражение, требует выражения для обозначения чего-то." _ –

5

В разделе JLS 15.25. Conditional Operator ?:

Это ошибка времени компиляции для второго или третьего выражения операнда быть вызовом метода пустот.

как второй и третий операнд выражения здесь:

direction == 0 ? System.out.print('L') : System.out.print('R'); 

void являются так что это не является допустимым использование трехкомпонентной выражения. Вы можете либо придерживаться if else или использовать что-то похожее на эту альтернативу:

System.out.print(direction == 0 ? 'L' : 'R'); 

Также логика здесь не правильно:

direction = (int)(Math.random() * 1); 

direction всегда будет вычисляться 0 поскольку Math.random() генерирует числа в диапазоне [0.0,1.0), что означает, что он не включает 1.0 и литье double в int будет только drop the decimals. Использование nextInt(2) - хорошая альтернатива.

+0

+1 для улова об использовании ' Math.random() '. OP должен использовать 'Math.random() * 2' или создать объект' java.util.Random' и использовать 'nextInt (2)'. –

+0

Да, на самом деле я поймал это, как только я протестировал программу. изменил его на направление = (Math.random() <0.5)? 0: 1; –

Смежные вопросы