Подтвердить что ты не робот

Должны ли мы всегда проверять каждый параметр метода в java на null в первой строке?

Каждый метод принимает набор значений параметров. Должны ли мы всегда проверять ненулевые входные параметры или допускать сбой кода с классическим RunTimeException?

Я видел много кода, где люди действительно не проверяют нулевость входных параметров и просто пишут бизнес-логику с использованием параметров. Каков наилучший способ?

void public( String a, Integer b, Object c)
{
  if( a == null || b == null || c == null)
  {
    throw new RunTimeException("Message...");
  }
  .....business logic.....
}
4b9b3361

Ответ 1

Лучший способ - проверить только при необходимости.

Если ваш метод private, например, так что вы знаете, что никто его не использует, и вы знаете, что вы не проходите ни с какими-либо нулями, то не нужно снова проверять.

Если ваш метод public, хотя, кто знает, что пользователи вашего API будут пытаться делать, поэтому лучше проверить.

Если в сомнении, отметьте.

Если лучшее, что вы можете сделать, однако, это выбросить NullPointerException, а затем, возможно, не захочет проверять. Например:

int getStringLength(String str) {
  return str.length();
}

Даже если вы отметили null, разумным вариантом будет выбрасывание NullPointerException, которое str.length() будет делать для вас в любом случае.

Ответ 2

Это неудачный аспект Java, который может быть null, и нет способа указать на языке, которым они не являются.

Как правило, да, не составляйте интерпретацию для null и не попадайте в ситуацию, когда NPE может быть брошен позже.

JSR305 (теперь неактивен) позволил вам аннотировать параметры, чтобы указать, что им не следует присваивать null s.

void fn(@Nonnull String a, @Nonnull Integer b, @Nonnull Object c) {

Подробный, но это Java для вас. Существуют и другие библиотеки аннотаций и шашки, которые делают то же самое, но нестандартны.

(Примечание о капитализации: когда слова верблюда-формы формы "не-штука", стандарт не использует значение слова маршрута если это не имя класса. Итак nonthing и nonnull.)

Аннотации также фактически не применяют правило, кроме случаев, когда выполняется checker. Вы можете статически включать метод для проверки:

public static <T> T nonnull(T value) {
    if (value == null) {
        throwNPE();
    }
    return value;
}
private static void throwNPE() {
    throw new NullPointerException();
}

Возвращаемое значение удобно в конструкторах:

import static pkg.Check.nonnull;

class MyClass {
    @Nonnull private final String thing;
    public MyClass(@Nonnull String thing) {
        this.thing = nonnull(thing);
    }
    ...

Ответ 3

Я не вижу большого смысла в этом. Вы просто воспроизводите поведение, которое вы получите бесплатно при первом использовании a, b или c.

Ответ 4

Нет. Стандартно предположить, что параметры не будут равны нулю и что исключение NullPointerException будет выбрано иначе. Если ваш метод разрешает параметр иметь значение null, вы должны указать, что в вашем api.

Ответ 5

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

Если нет, рекомендуется проверить null и создать исключение, потому что в противном случае вы получите NullPointerException, который вы никогда не должны улавливать, поскольку его внешний вид всегда указывает на то, что вы забыли проверить свои переменные в ваш код. (и если вы его поймаете, вы можете пропустить другие случаи его броска, и вы можете ввести ошибки).

С другой стороны, если вы выбрали RunTimeException или какое-либо другое настраиваемое исключение, вы могли бы обработать его где-то в верхнем потоке, чтобы у вас был больше контроля над тем, что происходит.

Ответ 6

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

Каковы бизнес-правила? Разрешено ли null для поля? Это не?

В любом случае всегда рекомендуется проверять значения NULL на ЛЮБЫХ параметрах, переданных перед тем, как вы пытаетесь работать с ними, поэтому вы не получаете NullPointerExceptions, когда кто-то передает вам плохие данные.

Ответ 7

Да, общедоступные методы должны очищать входные данные, особенно если плохой ввод может вызвать проблемы в коде метода. Хорошая идея - быстро провалиться; то есть проверить как можно скорее. Java 7 добавила новый класс Objects, который упрощает проверку нулевых параметров и включает настроенное сообщение:

public final void doSomething(String s)
{
  Objects.requireNonNull(s, "The input String cannot be null");
  // rest of your code goes here...
}

Это вызовет NullPointerException.

Javadocs для класса Objects: http://docs.oracle.com/javase/7/docs/api/java/util/Objects.html

Ответ 8

Это зависит от того, что пытается сделать ваш код, и о ситуации, в которой вы хотите выбросить Exception. Когда-нибудь вы захотите, чтобы ваш метод всегда выдавал исключение, если ваш метод не сможет нормально работать с нулевыми значениями. Если ваш метод может работать с нулевыми значениями, то, вероятно, не нужно бросать исключение.

Добавление слишком большого количества проверенных исключений может привести к очень запутанному и сложному коду. Именно по этой причине они не были включены в С#.

Ответ 9

Нет, вы не должны делать это повсеместно.

Мои предпочтения, по порядку, будут:

  • Сделайте что-нибудь разумное с нулевым. Разумная вещь, которую нужно сделать, полностью зависит от ситуации, но бросать обычное исключение не должно быть вашим первым выбором.
  • Используйте утверждение для проверки нулевого и тестового тестирования, устраняя любые ситуации, в которых вводится нулевой ввод, поскольку - ошибки a.k.a.
  • Для общедоступных API-документов документируйте, что значение null не разрешено, и дайте ему сбой с помощью NPE.

Ответ 10

Если вы не знаете, нужно ли вам это делать, есть вероятность, что вам не нужно это делать.

Источники JDK и книга Джошуа Блоха являются ужасными примерами, потому что они нацелены на самых разных аудиторий. Сколько из нас пишут публичные API для миллионов программистов?