这让我疯了一段时间,今天我管理重现这个问题,所以其中一个原因是除以0。
e.g。
var end:Number = 1024/0,
size:Number = 1000,
a:Array = [];
for (var i:int=0;i<end;i++){
a.push(size);
}
在除以0之后(我不知道它是如何可能的,但无论如何)值结束变为Infinity并潜入循环,因此flash播放器停止使用感叹号执行脚本。
我发现当flex中的一个组件布局状态发生变化后,传递其宽度为0作为构造循环的参数之一。如何避免flex组件的这种行为?
答案 0 :(得分:2)
这是大多数(如果不是全部)语言的预期行为。我刚刚测试了AS3,Javascript和PHP。 AS3和JS为您提供Infinity,PHP为您提供false
(如果存在低级别错误,则为PHP的首选处理程序)。你应该避免不惜一切代价除以0,因为它根本不可能。大多数语言不希望阻止用户除以0,因为无穷大是实际值,正确的值除以0,这就是他们允许的原因。
您的错误是因为您使用Infinity作为循环检查,这在循环中永远不会达到。
相反,使用条件来处理值为0的可能性。所以像:
function calculateRatio(x:Number, y:Number):Number {
if (y == 0) {
return 1; // or whatever to indicate an error
}
return x / y;
}
或
function calculateRatio(x:Number, y:Number):Number {
return x / (y == 0 ? 1 : y); // the value is still calculated, just makes sure y is not 0 at all times
}
只要确保你执行除法,你从不除以0.在你的情况下,你的循环运行无限次。 Flash是单线程的,并且在执行任何脚本执行时实际上会完全冻结。一般来说,这种情况发生得太快以至于最终用户没有注意到它,但在你的情况下,它会冻结到时间结束。幸运的是,Flash将在15或30秒结束脚本执行,具体取决于运行时版本,因此它应该在某些时候出错。
答案 1 :(得分:0)
除以0这里不是问题,0作为参数传递,作为运行时其他操作的结果,我不能确定,0将不作为参数传递。 令我难以置信的是,首先应该标记0除法,但它不是。然后从数学的角度得到无穷大的结果,但是然后我得到无限循环。我通常希望执行脚本的时间比例如15秒抛出一个错误并且脚本停止了,但我所拥有的是惊叹号,没有开发者的任何信息,这很糟糕..