2010-05-02 3 views
3

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

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

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

ответ

2

Они думали adding особенностей языка для JDK7, но ultimately they weren't added

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

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

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

+0

Ну NPE может быть выброшено по другим причинам, скажем, сам боб является недействительным. Разве нет никакой возможности в beanutils для этого? – Mohsen

1

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

Здесь Javadoc.

0

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

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); 
     } 
    }