Тернарный оператор не является заявлением

У меня есть следующее троичное выражение:

((!f.exists()) ? (f.createNewFile() ? printFile() : throw new Exception("Error in creating file")) : printFile());

По одной или нескольким причинам, по которым я не знаю, идея IDE говорит мне, что это не утверждение. Зачем?

4 ответа

Решение

Это неверно, вам нужно вернуть значение

printFile() : throw new Exception("Error in creating file")

Попробуй это

if(f.exists() || f.createNewFile()) {
  printFile();
}else{
  throw new Exception("Error in creating file");
}

Похоже, вы используете его как заявление, а не как назначение

Из того, что ТАК говорит, что это невозможно

Также от другого SO Articel, который говорит, что вы не можете бросить исключение в троичном выражении

Я думаю, что вам нужно вернуться к условию if-else, как это:

if (!f.exists()) {
   try {
      f.createNewFile();
      printFile();
   } catch(Exception e ) {
      System.out.println("Error in creating file");
   }
} else {
   printFile();
}

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

Пример:

  • Рассмотрим случай, когда переменная count увеличивается, и я проверяю ее значение и возвращаю true или false выше определенного порога.
  • System.out.println((count >10 ? true: false));
  • По сравнению с, count >10 ? true: false где компилятор будет жаловаться, что это не утверждение.

Конструкция "COND? Statement: Statement" является выражением. Это не может быть использовано как утверждение. Без присваивания его можно использовать в ситуации, такой как разрешение аргумента условия при вызове функции или конкатенации строк.

Func( (COND ? param1 : param2) );
"Hi"+(con?"Miss":"Mr.")+"";
Другие вопросы по тегам