Как предотвратить NPE при доступе к вложенному / проиндексированному свойству бина - PullRequest
3 голосов
/ 02 мая 2010

Есть ли способ предотвратить NPE при доступе к вложенному бину с помощью commons-beanutils?Вот мой код:

new BeanUtilsBean().getProperty(human, "parent.name");

В этом случае я хочу, чтобы getProperty() либо возвращал пустую строку (""), когда human.getParent() == null, либо обрабатывал ее иначе, чем бросая NPE.

Ответы [ 3 ]

2 голосов
/ 12 июля 2013

PropertyUtils имеет специальный метод для вложенных свойств getNestedProperty(...), который обрабатывает NPE, бросая NestedNullException, что, вероятно, (?) Лучше для глаза.

Вот этот Javadoc .

2 голосов
/ 02 мая 2010

Они думали о добавлении языковых возможностей в JDK7, но в конечном итоге они не были добавлены

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

public static void propertyHack(Object bean, String property, String nullreplace){
  try{
    return new BeanUtilsBean().getProperty(bean, property);
  }
  catch(NullPointerException npe){
    return nullreplace;
  }
}

Вид отстой, но это будет работать.

1 голос
/ 23 апреля 2014

Если кто-то ищет ответ

    Guia g = new Guia();
    GuiaParticipante gp = new GuiaParticipante(1);
    g.setTbGuiaParticipanteCollection(Collections.singletonList(gp));//comment this line to test
    String name = "tbGuiaParticipanteCollection[0].codParticipante";//the expression itself
    Resolver resolver = new DefaultResolver();//used to "clean" the expression
    if (resolver.isIndexed(name)) {
        String property = resolver.getProperty(name);//remove the [0].codParticipante

        if (PropertyUtils.getProperty(g, property) != null) { //get the collection object, so you can test if is null
            String cod = BeanUtils.getNestedProperty(g, name); //get the value if the collection isn't null
            System.out.println(cod);
        }
    } 
...