Чистый способ обработки нулевых указателей при использовании массивов - PullRequest
0 голосов
/ 31 августа 2010

У меня есть следующий код, который добавляет некоторые строки в массив. У него всегда будет пустая переменная из-за того, что кто-то не заполняет его правильно. У меня нет объекта usr, поэтому я не могу его изменить, к сожалению. Существует ли простой и простой способ добавления значения по умолчанию, если одно из этих значений пустое? Я не против, если он пуст, но я не хочу, чтобы программа вылетала!

    results.add(usr.getName());
    results.add(usr.getAbout());
    results.add(usr.getBirthday());
    results.add(usr.getEmail());
    results.add(usr.getGender());

Ответы [ 5 ]

4 голосов
/ 31 августа 2010

Вам просто нужно проверить, равны ли значения нулю.

String name = usr.getName();
if ( name != null ) {
   results.add(name);
}

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

results.add(usr.getName() != null ? usr.getName() : "");

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

Редактировать # 1

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

results.add(getValue(usr,"name"))
results.add(getValue(usr,"about"))

String getValue(def usr, String prop) {
   return usr."${prop}" ?: ""
}
1 голос
/ 31 августа 2010

Если вам это нужно часто, вы можете создать класс Cleaner, например:

package com.acme.util;

class Cleaner {

    public static String clean(String s, String defaultValue) {
        return s == null ? defaultValue : s;
    }

    public static Integer clean(Integer v, Integer defaultValue) {
        return v == null ? defaultValue : v;
    }

    public static Date clean(Date d, Date defaultValue) {
        return v == null ? defaultValue : d;
    }

    // ... and so on ...

}

, а затем использовать как:

import static com.acme.util.Cleaner.*;

results.add(clean(usr.getName(),"John Doe"));
...

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

Рики Кларксон отметил, что это можно выразить еще короче, используя дженерики как:

public static <T> T getOrElse(T t, T defaultValue) { return t == null ? defaultValue : t; }
0 голосов
/ 31 августа 2010

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

0 голосов
/ 31 августа 2010

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

results.add(usr.getName() != null ? usr.getName() : "default");
0 голосов
/ 31 августа 2010

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

result.remove(null);

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


Ресурсы:

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