Почему я не могу выбросить исключение при использовании троичного оператора

Это не компилируется и выдает следующую ошибку: Illegal start of expression, Зачем?

public static AppConfig getInstance() {
        return mConfig != null ? mConfig : (throw new RuntimeException("error"));
    }

4 ответа

Решение

Это потому, что троичный оператор в Java принимает форму expression ? expression : expression, и вы даете заявление в качестве заключительной части. Это не имеет смысла, поскольку утверждение не дает значения, в то время как выражения делают. Что должен делать Java, когда он находит условие ложным и пытается дать второе значение? Там нет значения.

Тернарный оператор предназначен для того, чтобы вы могли быстро сделать выбор между двумя переменными без использования полного if утверждение - это не то, что вы пытаетесь сделать, так что не используйте его, лучшее решение просто:

public static AppConfig getInstance() {
    if (mConfig != null) {
        return mConfig;
    } else {
        throw new RuntimeException("error");
    }
}

Тернарный оператор не предназначен для создания побочных эффектов - хотя он может быть создан для их создания, люди, читающие его, не ожидают этого, поэтому гораздо лучше использовать реальный if заявление, чтобы прояснить.

Вы можете написать служебный метод

public class Util
{
  /** Always throws {@link RuntimeException} with the given message */
  public static <T> T throwException(String msg)
  {
      throw new RuntimeException(msg);
  }
}

И используйте это так:

public static AppConfig getInstance() 
{
    return mConfig != null ? mConfig : Util.<AppConfig> throwException("error");
}

В случае, если это кому-то полезно, вот ответ с использованием java 8+ Необязательно:

public static AppConfig getInstance() {
    return Optional.ofNullable(mConfig).orElseThrow(() -> new RuntimeException("error"));
}

Вы пытаетесь вернуть throw new RuntimeException("error"), Вот почему вы получаете ошибку. Потому что в true если вы возвращаетесь AppConfig И в false если вы возвращаетесь exception,

Другие вопросы по тегам