Удобный способ проверить, не содержит ли Set нуль - PullRequest
6 голосов
/ 09 января 2012

У меня есть метод, которому присваивается Set объектов.Метод, которому он делегирует, требует, чтобы Set не содержал нулевых элементов.Я хотел бы проверить предварительное условие , что Set не содержит нулевых элементов на ранних этапах, в методе перед делегированием.Очевидный код делает это так:

public void scan(Set<PlugIn> plugIns) {
   if (plugIns == null) {
      throw new NullPointerException("plugIns");
   } else if (plugIns.contains(null)) {
      throw new NullPointerException("plugIns null element");
   }
   // Body
 }

Но это неверно, потому что Set.contains() может выдать NullPointerException, если реализация Set сама не разрешает нулевые элементы.Поймать и игнорировать NullPointerException в этом случае будет работать , но будет не элегантно .Есть ли удобный способ проверить это предварительное условие?


Есть ли ошибка в интерфейсе Set?Если реализация Set никогда не может содержать ноль, почему бы вместо этого не потребовать Set.contains(null), чтобы всегда возвращать false?Или есть предикат isNullElementPermitted()?

Ответы [ 3 ]

4 голосов
/ 09 января 2012

Простейшим способом было бы перечислить Set и проверить наличие нулей.

public void scan(Set<PlugIn> plugIns) {
  if (plugIns == null) throw new NullPointerException("plugIns");
  for (PlugIn plugIn : plugIns) {
    if (plugIn == null) throw new NullPointerException("plugIns null element");
  }
}
3 голосов
/ 09 января 2012

Создайте HashSet из plugIns и проверьте наличие null

public void scan(Set<PlugIn> plugIns) {
  if (plugIns == null) throw new NullPointerException("plugIns");
  Set<PlugIn> copy = new HashSet<PlugIn>(plugIns);
  if (copy.contains(null)) {
      throw new NullPointerException("null is not a valid plugin");
  }
}
2 голосов
/ 09 января 2012

Просто перехватите исключение NullPointerException, если выброшено, и проигнорируйте его:

public void scan(Set<PlugIn> plugIns) {
    if (plugIns == null) {
        throw new NullPointerException("plugIns");
    }

    NullPointerException e = null;
    try {
        if (plugIns.contains(null)) {
            // If thrown here, the catch would catch this NPE, so just create it
            e = new NullPointerException("plugIns null element");
        }
    } catch (NullPointerException ignore) { }

    if (e != null) {
        throw e;
    }
    // Body
}

Это создает только незначительные накладные расходы, если выброшено, но если вы не используете исключение (особенно трассировку strack), это на самом деле довольнолегкий.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...