I would like to create an object array but I get a java.lang.NullPointerException. At the moment I don’t know why and can’t find the mistake. The class will be saved in the GAE datastore. It would be nice if anyone could tell me what went wrong.
What I did:
@Transient private int plc = 0;
@Transient private Profile[] players = new Profile[4];
public void setPlayers(Profile player) {
if (plc < 4) {
this.players[plc] = new Profile(); // Exception
this.players[plc] = player;
plc++;
}
}
What do I miss?
Profile constructor
public Profile() {
}
public Profile(String account, String name, int gender) {
this.account = account;
this.name = name;
this.gender = gender;
}
Stracktrace
java.lang.NullPointerException
at packgesname.Game.setPlayers(Game.java:40)
at packgesname.JsonServlet.joinParty(JsonServlet.java:115)
at packgesname.JsonServlet.doGet(JsonServlet.java:47)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:617)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1166)
at com.google.appengine.api.socket.dev.DevSocketFilter.doFilter(DevSocketFilter.java:74)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.ResponseRewriterFilter.doFilter(ResponseRewriterFilter.java:110)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.HeaderVerificationFilter.doFilter(HeaderVerificationFilter.java:34)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.api.blobstore.dev.ServeBlobFilter.doFilter(ServeBlobFilter.java:61)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.StaticFileFilter.doFilter(StaticFileFilter.java:125)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at com.google.appengine.tools.development.BackendServersFilter.doFilter(BackendServersFilter.java:97)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1157)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:388)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at com.google.appengine.tools.development.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:94)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:380)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:923)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:547)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:212)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:409)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)
You’ve marked
playerswith the@Transientannotation. I don’t know what library this one is from, but it probably isn’t setting it to a value since it probably isn’t calling the constructor (thus initializing it there) nor is it setting the value (because it’s transient). Try lazily initializing it like so:Remember that serialization libraries will not serialize transient values in any way, and the new objects will have
nullfor transient fields, even if you initialize them in the constructor. This is because for most serialization libraries, the object is allocated, not constructed, by the library, and then its values are set after allocation. This skips over your constructor and doesn’t initialize the transientplayersto anything, leaving itnull.If you want to be sure, put a breakpoint in the constructor and serialize your object, then deserialize it. If the deserialization is calling the constructor (i.e. via reflection or some similar mechanism), then it will hit your breakpoint. If it doesn’t, then this is your problem.