2011-08-10 24 views
1

當我嘗試從我的登錄方法返回時,我的App引擎/ GWT項目正在吐出一堆令人討厭的堆棧跟蹤。我正在使用GAE版本1.5.0和GWT版本2.3.0。客戶端錯誤(無法調用null參數的方法'nullMethod':nullMethod)

這是一個Facebook應用程序,所以我得是這樣的:

  • 玩家導航到應用程序頁面。
  • 他們點擊一個按鈕,並重定向到OAuth認證頁面
  • 他們然後重定向迴應用程序,在查詢字符串
  • 我打破了查詢字符串除了獲得UID的認證令牌,然後使用該爲我的球員實體(RPC到App Engine後端)
  • 主鍵我檢索數據存儲播放器實體實例,並把它變成一個序列化類型返回到客戶端
  • 史詩失敗。

當我在JSAlert中吐出異常時,我得到一堆很大的堆棧跟蹤(我已經足夠仔細地使用「pretty」而不是「obfuscated」進行編譯)。

我的登錄功能,如下所示:

@Override 
public ClientPlayer login(String uid) { 
    PersistenceManager pm=PMF.get().getPersistenceManager(); 
    log.warning(Player.class.getName()); 
    log.warning(uid); 
    Key k=KeyFactory.createKey(Player.class.getSimpleName(), uid); 
    Player p; 
    List<List<Integer>> stats; 
    try{ 
     p=pm.getObjectById(Player.class, k); 
    } catch (JDOObjectNotFoundException e){ 
     p=new Player(uid); 
     p.setKey(k); 
     pm.makePersistent(p); 
    } finally { 
     pm.close(); 
    } 
    stats=p.getStats(); 
    return new ClientPlayer(p.getUID(),p.getPerm(), p.getDecks(),stats.get(0), stats.get(1), stats.get(2)); 
} 

不幸的是,由於NDA,我不能鏈接到應用程序,但這裏的輸出:

Failure to log in because of: 
    com.google.gwt.core.client.JavaScriptException: (TypeError): Cannot call method 'nullMethod' of null 
    arguments: nullMethod, 
    type: non_object_property_call 
    stack: TypeError: Cannot call method 'nullMethod' of null 
     at Object.ClientPlayer_1 (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:993:89) 
     at Object.ClientPlayer_0 (http://*com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:984:18) 
     at Array.instantiate_1 [as 0] (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:1031:10) 
     at $instantiate_0 (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:10660:34) 
     at $instantiate (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:1948:10) 
     at $readObject (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:10148:95) 
     at Object.read_8 [as read] (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:10608:10) 
     at $onResponseReceived (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:10352:247) 
     at $fireOnResponseReceived (http://*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:5002:5) 
     at Object.onReadyStateChange (http:/*.com/com.MES.Tap2/A37A2E2E9A65DB1BAAE2BFA42572F7F8.cache.html:5222:5) 

回答

1

的問題是在使用IsSerializable界面,或者更確切地說我對它的理解不夠。

當您創建一個IsSerialiazable對象時,它需要一個無參數的構造函數。我將該構造函數的空值傳遞給主構造函數,因此在調用方法時會發生空指針異常。這是愚蠢的,但嘿,這是一個學習經驗。

在我的特殊情況下,就有點像這樣...

public class ClientObject implements IsSerializable { 
    private Object field1; 
    private Object field2; 
    private String field3; 

    public ClientObject(){ 
     this(null, null); 
    } 
    public ClientObject(Object arg1, Object arg2){ 
     field1=arg1; 
     field2=arg2; 
     field3=arg1.toString()+arg2.toString(); 
     //Error on above line, though not obviously mentioned in the message 
    } 
} 

什麼應該完成的事情是......

public ClientObject(){ 
    this(new Object(), new Object()); 
} 

希望這可以幫助別人。