0

オブジェクト配列を作成したいのですが、を取得しjava.lang.NullPointerExceptionます。現時点では理由がわからず、間違いを見つけることができません。クラスはGAEデータストアに保存されます。誰かが何が悪かったのか教えてくれたらいいのにと思います。

私がしたこと:

@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++;
    }
}

何が恋しいですか?

プロファイルコンストラクター

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)
4

2 に答える 2

0

コンストラクター内で問題が発生している可能性がありますが、そこにProfileスローする可能性のあるコードはNullPointerExceptionありますか?

于 2012-10-29T16:23:40.303 に答える
0

注釈を付けplayersました。@Transientこれがどのライブラリからのものかはわかりませんが、おそらくコンストラクターを呼び出していないため(したがって、そこで初期化されていないため)、値を設定していないため(一時的であるため)、値に設定されていません。そのように怠惰に初期化してみてください:

public void setPlayers(Profile player) {
    if (this.players == null)
        this.players = new Profile[4];
    if (plc < 4) {
        this.players[plc] = new Profile(); // Exception
        this.players[plc] = player;
        plc++;
    }
}

シリアル化ライブラリは一時的な値をシリアルnull化しないことに注意してください。コンストラクタで初期化した場合でも、新しいオブジェクトには一時的なフィールドがあります。これは、ほとんどのシリアル化ライブラリでは、オブジェクトがライブラリによって構築されるのではなく割り当てられ、割り当て後にその値が設定されるためです。これはコンストラクターをスキップし、トランジェントを何にも初期化せず、そのままにします。playersnull

確実にしたい場合は、コンストラクターにブレークポイントを設定し、オブジェクトをシリアル化してから、逆シリアル化します。デシリアライズがコンストラクターを呼び出している場合(つまり、リフレクションまたは同様のメカニズムを介して)、ブレークポイントに到達します。そうでない場合、これはあなたの問題です。

于 2012-10-29T16:36:01.753 に答える