2012-12-25 4 views
-3

내 문제는 단순히 nullpointerexception이지만, 나는 그것을 어떻게 알아낼 수 없습니다. 여기 코드가 있습니다.nullpointerexception

primefaces의 채팅 유틸리티를 실행하려고합니다. 그리고 내가 바람둥이 7을 사용하고 있습니다 .. 지금까지 내가 여기 도달 할 수 있지만 지금은이 문제가있어.

public class ChatView { 

private final PushContext pushContext = PushContextFactory.getDefault().getPushContext(); 

private ChatUsers users; 

    private String privateMessage; 

private String globalMessage; 

    private String username; 

    private boolean loggedIn; 

private String privateUser; 

private final static String CHANNEL = "/chat/"; 

public void setUsers(ChatUsers users) { 
    this.users = users; 
} 

public String getPrivateUser() { 
    return privateUser; 
} 

public void setPrivateUser(String privateUser) { 
    this.privateUser = privateUser; 
} 

public String getGlobalMessage() { 
    return globalMessage; 
} 

public void setGlobalMessage(String globalMessage) { 
    this.globalMessage = globalMessage; 
} 

public String getPrivateMessage() { 
    return privateMessage; 
} 

public void setPrivateMessage(String privateMessage) { 
    this.privateMessage = privateMessage; 
} 

    public String getUsername() { 
      return username; 
    } 
    public void setUsername(String username) { 
      this.username = username; 
    } 

    public boolean isLoggedIn() { 
      return loggedIn; 
    } 
    public void setLoggedIn(boolean loggedIn) { 
      this.loggedIn = loggedIn; 
    } 

    public void sendGlobal() { 
    pushContext.push(CHANNEL + "*", username + ": " + globalMessage); 

      globalMessage = null; 
    } 

public void sendPrivate() { 
    pushContext.push(CHANNEL + privateUser, "[PM] " + username + ": " + privateMessage); 

    privateMessage = null; 
} 

    public void login() { 
    RequestContext requestContext = RequestContext.getCurrentInstance(); 

      if(users.contains(username)) { 
     loggedIn = false; 
     FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, "Username taken", "Try with another username.")); 

     requestContext.update("growl"); 
    } 
    else { 
     users.addUser(username); 
     pushContext.push(CHANNEL, username + " joined the channel."); 
     requestContext.execute("subscriber.connect('/" + username + "')"); 
     loggedIn = true; 
    } 
    } 

public void disconnect() { 
    //remove user and update ui 
    users.removeUser(username); 
    RequestContext.getCurrentInstance().update("form:users"); 

    //push leave information 
    pushContext.push(CHANNEL, username + " left the channel."); 

    //reset state 
    loggedIn = false; 
    username = null; 
} 
} 

....

public class User implements Serializable { 


private static final long serialVersionUID = 1L; 
    private String firstname; 
    private String lastname; 
    private Integer age; 
    private String street; 
    private String city; 
    private String postalCode; 
    private String info; 
    private String email; 
    private String phone; 

    public String getFirstname() { 
      return firstname; 
    } 

    public void setFirstname(String firstname) { 
      this.firstname = firstname; 
    } 

    public String getLastname() { 
      return lastname; 
    } 

    public void setLastname(String lastname) { 
      this.lastname = lastname; 
    } 

    public Integer getAge() { 
      return age; 
    } 

    public void setAge(Integer age) { 
      this.age = age; 
    } 

    public String getStreet() { 
      return street; 
    } 

    public void setStreet(String street) { 
      this.street = street; 
    } 

    public String getCity() { 
      return city; 
    } 

    public void setCity(String city) { 
      this.city = city; 
    } 

    public String getPostalCode() { 
      return postalCode; 
    } 

    public void setPostalCode(String postalCode) { 
      this.postalCode = postalCode; 
    } 

    public String getInfo() { 
      return info; 
    } 

    public void setInfo(String info) { 
      this.info = info; 
    } 

    public String getEmail() { 
      return email; 
    } 

    public void setEmail(String email) { 
      this.email = email; 
    } 

    public String getPhone() { 
      return phone; 
    } 

    public void setPhone(String phone) { 
      this.phone = phone; 
    } 
} 

....

public class ChatUsers { 

private List<String> users = Arrays.asList("fatih"); 


@PostConstruct 
public void init() { 
    this.users = new ArrayList<String>(); 
} 

public List<String> getUsers() { 
    return users; 
} 

public void setUsers(List<String> users) { 
    this.users = users; 
} 

public void addUser(String user) { 
    this.users.add(user); 
} 

public void removeUser(String user) { 
    this.users.remove(user); 
} 

public boolean contains(String user) { 
    return this.users.contains(user); 
} 
} 

나는 ChatView 클래스와이 라인 if(users.contains(username))

에 대한 예외를 얻고 어떤 제안은 매우 것 도움이됩니다. 감사합니다 ..

편집

'SEVERE: Received 'java.lang.UnsupportedOperationException' when invoking action listener '#{chatView.login}' for component 'j_idt21' 
Dec 25, 2012 10:01:18 PM javax.faces.event.MethodExpressionActionListener processAction 
SEVERE: java.lang.UnsupportedOperationException 
at java.util.AbstractList.add(Unknown Source) 
at java.util.AbstractList.add(Unknown Source) 
at org.primefaces.examples.view.ChatUsers.addUser(ChatUsers.java:43) 
at org.primefaces.examples.view.ChatView.login(ChatView.java:109) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.apache.el.parser.AstValue.invoke(AstValue.java:278) 
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274) 
at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:153) 
at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) 
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769) 
at javax.faces.component.UICommand.broadcast(UICommand.java:300) 
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 

Dec 25, 2012 10:01:18 PM com.sun.faces.context.AjaxExceptionHandlerImpl log 
SEVERE: JSF1073: javax.faces.event.AbortProcessingException caught during processing of INVOKE_APPLICATION 5 : UIComponent-ClientId=form:j_idt21, Message=java.lang.UnsupportedOperationException 
Dec 25, 2012 10:01:18 PM com.sun.faces.context.AjaxExceptionHandlerImpl log 
SEVERE: java.lang.UnsupportedOperationException 
javax.faces.event.AbortProcessingException: java.lang.UnsupportedOperationException 
at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListener.java:182) 
at javax.faces.event.ActionEvent.processListener(ActionEvent.java:88) 
at javax.faces.component.UIComponentBase.broadcast(UIComponentBase.java:769) 
at javax.faces.component.UICommand.broadcast(UICommand.java:300) 
at javax.faces.component.UIViewRoot.broadcastEvents(UIViewRoot.java:794) 
at javax.faces.component.UIViewRoot.processApplication(UIViewRoot.java:1259) 
at com.sun.faces.lifecycle.InvokeApplicationPhase.execute(InvokeApplicationPhase.java:81) 
at com.sun.faces.lifecycle.Phase.doPhase(Phase.java:101) 
at com.sun.faces.lifecycle.LifecycleImpl.execute(LifecycleImpl.java:118) 
at javax.faces.webapp.FacesServlet.service(FacesServlet.java:593) 
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305) 
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210) 
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222) 
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123) 
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472) 
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:168) 
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99) 
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:929) 
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118) 
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407) 
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1002) 
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:585) 
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:312) 
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source) 
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.UnsupportedOperationException 
at java.util.AbstractList.add(Unknown Source) 
at java.util.AbstractList.add(Unknown Source) 
at org.primefaces.examples.view.ChatUsers.addUser(ChatUsers.java:43) 
at org.primefaces.examples.view.ChatView.login(ChatView.java:109) 
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
at java.lang.reflect.Method.invoke(Unknown Source) 
at org.apache.el.parser.AstValue.invoke(AstValue.java:278) 
at org.apache.el.MethodExpressionImpl.invoke(MethodExpressionImpl.java:274) 
at javax.faces.event.MethodExpressionActionListener.processAction(MethodExpressionActionListen er.java:153) 
... 25 more 

'

+0

정말 entore 클래스를 통과하지 못했습니다.하지만 마지막 문장에서 나는'users' 식별자의 값을 얻을 수 있습니다. – iDroid

+0

예외 스택 추적을 게시하면 도움이 될 것입니다. –

답변

9

당신은 더-곳이 CharView 클래스의 ChatUsers 참조를 초기화하지 있습니다. 따라서 사용하면 NPE이 표시됩니다. 또는 login 메서드 전에 setUsers 메서드를 호출하지 않았을 수 있으므로 users은 초기화되지 않은 상태로 유지됩니다.

귀하의 선언 : -

private ChatUsers users; 

을 변경해야합니다 : -


private ChatUsers users = new ChatUsers(); 
업데이트 : - 당신은 목록을 작성하여 CharView 클래스에서

, like : -

private List<String> users = Arrays.asList("fatih"); 

수정할 수없는 고정 크기 목록이 표시됩니다. 따라서 사용자가 ChatView 클래스 인 addUsers 메서드에서 사용자를 추가하려고하면 UnsupportedOperationException이 표시됩니다.

private List<String> users = new ArrayList<String>(); 

그리고 당신은 선언시 그 목록을 초기화하려는 경우, 당신은 할 수 있습니다 : - -을 :

이 같은 목록을 작성해야합니다

private List<String> users = new ArrayList<String>() {{ 
    add("fatih"); 
}}; 

double braces initialization라고

+1

이것은 관리 빈의 범위에 따라 다를 수 있습니다. 어쩌면 코드의 다른 곳으로 주입되었을 수도 있습니다. –

+0

@ LuiggiMendoza. 물론, 클래스에 일부 삽입이 표시 될 수있는 주석이 표시되지 않습니다. –

+0

@LuiggiMendoza getter setters가 관련되어 있기 때문에 귀하의 요점에 동의합니다. 그래서이 클래스와는 독립적으로 주입이있을 것 같습니다. – iDroid

0

메모를 확인하시기 바랍니다

private ChatUsers users; 
,

그리고

private ChatUsers users = null; 

클래스 변수와 동일합니다.

그래서 사용하기 전에 null이 아닌 객체로 초기화해야합니다.