导致GWT输出的原因是:<somethingnotnull> .nullMethod()?</somethingnotnull>

时间:2014-05-11 18:05:24

标签: gwt

我有自己的java.util.Timer仿真(以及GWT中缺少的很多其他东西)。我甚至有一个JUnit测试证明它在浏览器中有效。

我刚尝试将某些第三方库转换为GWT,后者需要一个Timer,在某些部分,我打电话给:

SystemUtils.getTimer().scheduleAtFixedRate(timerTask, value, value);

但GWT编译器将getTimer()。scheduleAtFixedRate()转换为:

getTimer().nullMethod()

SystemUtils.getTimer()是一个静态方法。我用google搜索nullMethod(),但大多数点击是关于:

null.nullMethod();

这不适用于我。可能出现什么问题,我该怎么做才能解决它?

[编辑]实际上,java.util.Timer仿真本身有效,但似乎(atm?)SystemUtils.getTimer()返回&#34; undefined&#34;。这可能是原因吗?由于getTimer()返回一个动态创建的实例,GWT编译器如何可能对getTimer()的返回值以及Timer类型的方法的存在/使用做出任何假设?

2 个答案:

答案 0 :(得分:1)

当我看到这种错误时,它是由无法访问的代码引起的:GWT已经确定某些代码无法访问,关闭某些内容的编译,但它仍然以某种方式尝试链接无法访问的代码,显示这种错误。

答案 1 :(得分:1)

为了完整起见

如果出现此错误(通常在部署到App Engine后发生),则编译时不进行模糊处理,关闭超级开发模式,重新启动jetty并刷新浏览器。打开生成的JavaScript并通过搜索'nullMethod'找到问题发生的位置。您将看到编译器可能已经删除了它认为“无法访问”的整个代码块。

围绕'null.nullMethod'的代码可能与您的预期非常不同。最简单的方法是添加一个null / undefined检查并初始化生成为'null'的任何变量。这迫使编译器重新考虑,因为现在变量永远不能为null,并且后面的代码必须是可达的。

例如,如果找到null.nullMethod并且'null'实际上应该是var a = ...,那么在它之前添加if(a == null) { a = ""; }(当然是在Java中)。