2014-05-21 82 views
-1

這是把我逼瘋了一段時間,今天我manged重現此問題,做的原因之一是除以0灰色安裝Flashplayer感嘆號錯誤

例如

var end:Number = 1024/0, 
    size:Number = 1000, 
    a:Array = []; 

for (var i:int=0;i<end;i++){ 
     a.push(size); 
}    

除以0後(我不知道怎麼的可能,但無論如何)值最終變爲無限,並偷偷進入死循環,因此閃存播放器停止與感嘆號腳本的執行。

我發現當Flex中的某個組件在佈局狀態發生變化後,將其寬度爲0的參數作爲參數之一傳遞來構造循環。如何避免flex組件的這種行爲?

+1

不要除以零? – KevinDTimm

+0

Primo:除非開發人員付出努力,否則通過更改組件的大小,您可能會在描述中注意到這一點。 Secundo:FlashPlayer可以如何分割0並將其轉換爲無限? – Pablito

+3

究竟是什麼問題? – Brian

回答

2

這是大多數(即使不是全部)語言的預期行爲。我只測試了AS3,Javascript和PHP。 AS3和JS給你Infinity,PHP給你false(如果出現低級錯誤,PHP的前往處理程序)。你應該避免不惜一切代價除以0,因爲這根本不可能。大多數語言不希望阻止用戶除以0,因爲Infinity是實際值並且除以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秒結束腳本執行,因此在某些時候它應該會出錯。

0

除0之外不存在這樣的問題,因此在運行時由於其他操作而將0作爲參數傳遞,並且我不能確定0不會作爲參數傳遞。 我的想法令人難以置信的是,除0之外的部分應該首先標記,但事實並非如此。然後得到無限的結果,從數學的角度來看,然後我得到無限循環。我通常希望執行腳本的時間長於例如15秒拋出一個錯誤,腳本停止,但相反,我所擁有的是驚歎號,沒有任何開發人員的信息,而且很糟糕。並且這太糟糕了。