Джава "?"Оператор для проверки нуля - что это?(Не троичный!) - PullRequest
68 голосов
/ 08 декабря 2010

Я читал статью, связанную с историей о слэшдоте, и наткнулся на этот маленький кусочек:

Возьмите последнюю версию Java, которая пытается выполнить проверку нулевого указателя проще, предлагая сокращенный синтаксис для бесконечного тестирования указателя. Просто добавление знака вопроса к каждому методу вызов автоматически включает в себя проверить нулевые указатели, заменив крысиное гнездо утверждений if-then, таких как: public String getPostcode(Person person) { String ans= null; if (person != null) { Name nm= person.getName(); if (nm!= null) { ans= nm.getPostcode(); } } return ans }

С этим: public String getFirstName(Person person) { return person?.getName()?.getGivenName(); }

Я искал в интернете (хорошо, я потратил не менее 15 минут на поиски вариантов «знака вопроса java») и ничего не получил. Итак, мой вопрос: есть ли официальная документация по этому вопросу? Я обнаружил, что в C # есть аналогичный оператор (оператор «??»), но я хотел бы получить документацию для языка, на котором я работаю. Или это просто использование троичного оператора, который я использую? никогда не видел раньше.

Спасибо!

РЕДАКТИРОВАТЬ: Ссылка на статью: http://infoworld.com/d/developer-world/12-programming-mistakes-avoid-292

Ответы [ 14 ]

0 голосов
/ 29 ноября 2017

Вы можете проверить предоставленный вами код, и он выдаст синтаксическую ошибку. Так что он не поддерживается в Java.Groovy поддерживает его, и он был предложен для Java 7 (но так и не был включен).

Однако вы можете использовать Optional, предоставляемый в Java 8. Это может помочь вам в достижении чего-то подобного.https://docs.oracle.com/javase/8/docs/api/java/util/Optional.html http://www.oracle.com/technetwork/articles/java/java8-optional-2175753.html

Пример кода для дополнительного

0 голосов
/ 18 ноября 2015

Если кто-то ищет альтернативу для старых версий Java, вы можете попробовать эту, которую я написал:

/**
 * Strong typed Lambda to return NULL or DEFAULT VALUES instead of runtime errors. 
 * if you override the defaultValue method, if the execution result was null it will be used in place
 * 
 * 
 * Sample:
 * 
 * It won't throw a NullPointerException but null.
 * <pre>
 * {@code
 *  new RuntimeExceptionHandlerLambda<String> () {
 *      @Override
 *      public String evaluate() {
 *          String x = null;
 *          return x.trim();
 *      }  
 *  }.get();
 * }
 * <pre>
 * 
 * 
 * @author Robson_Farias
 *
 */

public abstract class RuntimeExceptionHandlerLambda<T> {

    private T result;

    private RuntimeException exception;

    public abstract T evaluate();

    public RuntimeException getException() {
        return exception;
    }

    public boolean hasException() {
        return exception != null;
    }

    public T defaultValue() {
        return result;
    }

    public T get() {
        try {
            result = evaluate();
        } catch (RuntimeException runtimeException) {
            exception = runtimeException;
        }
        return result == null ? defaultValue() : result;
    }

}
0 голосов
/ 21 марта 2014

Вот вам, нуль-безопасный вызов в Java 8:

public void someMethod() {
    String userName = nullIfAbsent(new Order(), t -> t.getAccount().getUser()
        .getName());
}

static <T, R> R nullIfAbsent(T t, Function<T, R> funct) {
    try {
        return funct.apply(t);
    } catch (NullPointerException e) {
        return null;
    }
}
0 голосов
/ 08 декабря 2010

Если это не проблема производительности, вы можете написать

public String getFirstName(Person person) {
  try {
     return person.getName().getGivenName();
  } catch (NullPointerException ignored) {
     return null;
  }
} 
...