ActionScript3.0の変数初期化について一言(誤解だった模様)

えらそうにぐだぐだ書きましたが、誤解だったようです。ご迷惑をおかけしました。

とはいえ、本当にこういう動作をしないのか?と言われると「しない!」とも言えないので(「しない!」と言えるだけの知識が無いので)一応残しておきます。

ActionScript3.0は、以下のようにローカル変数を宣言できます。

//function foo():void{
//
//	var loader:URLLoader() = new URLLoader();
//
//	//なんらかの処理
//
//	loader.load();
//
//}

で、このメソッド内の処理を、「try-catchでかこって例外処理をしたい!」と思って以下のように書いたとします。

//function foo():void{
//
//	try{
//		var loader:URLLoader() = new URLLoader();
//	
//		//なんらかの処理
//
//		loader.load();
//	}catch(error:Error){
//		trace(error);
//	}
//}

これでErrorがキャッチされるはず・・・と思いきや。
ActionScriptのコンパイラ(FlexSDK)はメソッド内の変数宣言を一番最初に持って来てくれるという、Java使い的にはよく分からない)仕様になっているため、実際にコンパイルされた中身は(きっと)こんな感じになっています。

//function foo():void{
//
//	var loader:URLLoader() = new URLLoader();	//ココで発生した例外はどうなる?
//	
//	try{
//	
//		//なんらかの処理
//
//		loader.load();
//	}catch(error:Error){
//		trace(error);
//	}
//}

そんな仕様のおかげで、new URLLoader()で例外が発生すると「キャッチされない例外」が発生します。
(デバッガモードのFlash Playerの場合は例外を表すダイアログが表示され、デバッガモードじゃないFlash Playerの場合は何も表示されません。)

上記問題を回避するには、

//function foo():void{
//	
//	try{
//
//		var loader:URLLoader();	//変数宣言部分だけが最初にいくっぽい
//		loader = new URLLoader();	//ココはtry-catchの中のまま
//
//		//なんらかの処理
//
//		loader.load();
//	}catch(error:Error){
//		trace(error);
//	}
//}

みたいに書くと良さげです。

NNDDのDLが100%で止まる原因はこれだったっぽいですよ・・・。