Вызов метода управляемого компонента возвращает NPE

У меня простой вопрос: почему я всегда получаю NPE, когда вызываю метод управляемого компонента, который либо возвращает список. Я использую компонент мастера простых лиц, на мой взгляд. Например, может ли кто-нибудь сказать мне разницу между этими двумя:

Не работает:

public List<RequiredParam> getRequiredFields() {
   if(!this.sdeCommand.getActions().isEmpty() &&this.action!=null &&!this.action.equals("")){
       for(CommandAction act:this.sdeCommand.getCommandActions()){
           if(act.getActionName().equalsIgnoreCase(this.action)){
               this.requiredFields.addAll(act.getFields());
           }
       }
   }
    return this.requiredFields;
}

Однако это работает:

public List<RequiredParam> getRequiredFields() {

    return this.requiredFields;
}

Вид:

                                <c:forEach items="${gdsiGeodataBean.requiredFields}" var="reqs">
                                    <h:outputLabel for="#{reqs.name}" value="#{reqs.name}:* " />  
                                </c:forEach>

Сообщение об ошибке:

java.lang.NullPointerException
    com.tsystems.appbeans.GdsiGeodataBean.getRequiredFields(GdsiGeodataBean.java:103)
    sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    java.lang.reflect.Method.invoke(Method.java:597)
    javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
    com.sun.faces.el.DemuxCompositeELResolver._getValue(DemuxCompositeELResolver.java:176)
    com.sun.faces.el.DemuxCompositeELResolver.getValue(DemuxCompositeELResolver.java:203)
    org.apache.el.parser.AstValue.getValue(AstValue.java:118)
...

мой взгляд:


person algone    schedule 05.01.2012    source источник
comment
Очевидно, что некоторые свойства вашего bean-компонента null. Внимательно проверьте, правильно ли вы создали все свои свойства List.   -  person Mr.J4mes    schedule 05.01.2012
comment
@ Mr.J4mes, спасибо, одно из свойств было пустым. Я использую мастер, и я установил привязку свойства на предыдущей вкладке. каким-то образом имущество потеряло свою ценность.   -  person algone    schedule 05.01.2012


Ответы (1)


this.sdeCommand.getActions().isEmpty()

Приведенное выше вызовет NPE, если getActions() вернет значение null. Сначала убедитесь, что getActions() != null. Это может быть или не быть вашей проблемой, но это, безусловно, небезопасный код, и он никогда не должен проходить формальную проверку кода.

person maple_shaft    schedule 05.01.2012
comment
Спасибо что подметил это. Я думаю, что это была проблема. Я был уверен, что метод возвращает список, но я должен был проверить. теперь работает нормально! Однако у меня есть другая связанная проблема: в том же компоненте у меня есть простое строковое свойство с геттером и сеттером. Геттер работает нормально, но не сеттер. В методе установки я создаю Stringbuffer для каждого входящего параметра. Это неправильно? Я проверил в установщике, чтобы увидеть, передается ли входная строка, но, по-видимому, метод вообще не вызывается/не вызывается. В представлении я использую нотацию #{}. - person algone; 05.01.2012
comment
@algone Трудно сказать, в чем проблема, не видя кода. Пожалуйста, опубликуйте это как отдельный вопрос, и мы можем попытаться вам помочь. - person maple_shaft; 05.01.2012
comment
@Mr.J4mes Это отдельный вопрос, и его следует задавать в другом вопросе, а не в этом вопросе. - person maple_shaft; 05.01.2012
comment
@Mr.J4mes Вопрос был опубликован, теперь см.: ссылка - person algone; 06.01.2012
comment
@maple_shaft Вопрос был опубликован, теперь см.: bean-properties-not-being-updated - person algone; 06.01.2012