【问题标题】:Why is a GWT application crashing on blackberry OS7?为什么 GWT 应用程序在黑莓 OS7 上崩溃?
【发布时间】:2012-06-28 16:12:37
【问题描述】:

我在黑莓os7浏览器上尝试了以下代码:

<html>
<body>
test page
<script>
i = 0;
if(i < -2147483647) {
   alert("very low")
} 

if(i < -2147483648) {
   alert("very very low")
} 

if(i < -2147483649) {
    alert("very very very low")
}
</script></body></html>

而且令人惊讶的是它的结果非常低!

我认为 javascript 中的整数应该支持的不止这些。当然,这段代码在其他浏览器上也能正常运行...

棘手的是,我发现尝试在黑莓上运行 gwt 应用程序。它在 OS6 上运行良好,但在 OS7 上却不行。我调试了由 GWT 编译的代码,碰巧 Integer.parseInt 的 javascript 实现使用 int 的极高和极低进行了测试。由于 OS7 浏览器似乎不能正确支持这些极端值(位溢出?)我得到一个异常并且我的应用程序没有启动......

我正在为此寻找解决方案。我正在考虑为黑莓重写 GWT integer.parseInt 实现。你怎么看?还有其他想法吗?

【问题讨论】:

  • 也许重新绑定将是一个优雅的解决方案,也许使用自己的属性提供者 - os7 使用的浏览器排列是什么?
  • 这实际上是一个基于 webkit 的浏览器,所以我猜它是 safari 排列。我们正在考虑在 GWT 中重新绑定 integer.parseInt() 方法,但我们还没有找到方法。重新绑定是一个优雅的解决方法,这是肯定的。如果我们发现了什么,我会发布解决方案。
  • 啊,正常的重新绑定不起作用,因为您不能扩展 Integer 并且 parseInt 是静态的,对吗?会有另一种解决方案:gwt 超级采购。但是,这将需要您实现整数的所有函数和字段。如果你想序列化它(例如在异步调用中),它会变得更加复杂。并且仍然不可能重新绑定,因此所有排列都使用新类。如果需要,我很乐意为您提供更多相关信息,但这确实是最后一线希望。
  • 目前我们找到的解决方案实际上是避免使用 integer.parseInt。从长远来看,这种解决方案是不可接受的,但它允许我们发布我们的黑莓产品。也许我们可以编写一种实用方法来调用,而不是在我们的代码中调用 parseInt。我希望 RIM 意识到这一点,我希望他们能尽快修复它......

标签: gwt blackberry crash parseint


【解决方案1】:

如果有人在寻找答案时偶然发现了这个旧线程:

在我看来,错误出在 JS 引擎的编译器部分。

片段 1:

var i = 0;
if (i < -2147483648) {
  console.log("less");
} else {
  console.log("greater");
}

片段 2:

var i = 0;
var j = i < -2147483648;
if (j) {
  console.log("less");
} else {
  console.log("greater");
}

虽然 sn-p 1 通过记录“less”来显示错误,但 sn-p 2 不会。

因此,为了解决这个错误,我们检查了 GWT 源代码并在应用此补丁的情况下编译了我们自己的 SDK。从那以后我们就没有遇到过 Integer.parseInt 的问题。

diff --git a/gwt240/source/user/super/com/google/gwt/emul/java/lang/Number.java         b/gwt240/source/user/super/com/google/gwt/emul/java/lang/Number.java
index 04a85e1..abb3e5c 100644
--- a/gwt240/source/user/super/com/google/gwt/emul/java/lang/Number.java
+++ b/gwt240/source/user/super/com/google/gwt/emul/java/lang/Number.java
@@ -221,9 +221,10 @@ public abstract class Number implements Serializable {
     }

     int toReturn = __parseInt(s, radix);
+    boolean isTooLow = toReturn < lowerBound;
     if (__isNaN(toReturn)) {
       throw NumberFormatException.forInputString(s);
-    } else if (toReturn < lowerBound || toReturn > upperBound) {
+    } else if (isTooLow || toReturn > upperBound) {
       throw NumberFormatException.forInputString(s);
     }

GWT 错误报告链接:http://code.google.com/p/google-web-toolkit/issues/detail?id=7291

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多