首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >客户端错误(不能调用空参数的方法'nullMethod‘:nullMethod)

客户端错误(不能调用空参数的方法'nullMethod‘:nullMethod)
EN

Stack Overflow用户
提问于 2011-08-10 02:58:11
回答 1查看 674关注 0票数 1

每当我的App / GWT项目尝试从我的登录方法返回时,它就会发出一堆讨厌的堆栈跟踪。我使用的是GAE版本1.5.0和GWT版本2.3.0。

这是一个facebook应用程序,所以我得到的是:

  • 播放机导航到应用程序页面,
  • 单击一个按钮,然后重定向到OAuth身份验证页面
  • ,然后用查询字符串
  • 中的身份验证令牌将查询字符串拆分以获得UID,然后使用它作为播放机实体的主键(RPC到app引擎后端)
  • 从数据存储中检索播放机实体实例,并将其转换为一个可序列化的类型,返回到客户端
  • Epic fail。<>codef 213/code>

当我在JSAlert中抛出异常时,我得到了一堆令人讨厌的堆栈跟踪(我已经考虑过使用“漂亮”而不是“混淆”来编译)。

我的登录功能如下所示:

代码语言:javascript
复制
@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,我无法链接到应用程序,但是输出如下:

代码语言:javascript
复制
    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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-22 18:06:20

问题在于IsSerializable接口的使用,或者说我对它的理解很差。

当您创建一个IsSerialiazable对象时,它需要一个非参数构造函数。我将空值从构造函数传递给主构造函数,因此当调用方法时,会出现空指针异常。我真傻,但是这是一次学习的经历。

在我这种情况下,有点像这样.

代码语言:javascript
复制
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
    }
}

应该做的是..。

代码语言:javascript
复制
public ClientObject(){
    this(new Object(), new Object());
}

希望这能帮上忙。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7005386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档