var obj:Obj; → var obj:Obj = null;で完全に初期化せよ
try catchはエラーがでない分、普段ならでるはずのnullエラーがでなくて原因がつかみにくかった。
for(){
var obj:Obj;//★0
try{
obj = arr[i][j] as Obj; }catch(err:*){
}
if(obj != null){//★1
//objがあったときの処理★2
}}
結論から言うと、★0は初期化されていない場合があって危険だということ。
つまり、★0の書き方では、objがnullにならない場合がある。
その結果、★1で、nullかどうかのチェックの結果が意図しないものになる。
対策としては、
var obj:Obj = null;//★0_2
のように明記すること。
この嵌りポイントに気づきにくくしていた要因がtry
try内でnull参照エラーがでたとき、普段はそれで気づくのだけれども、それがでない。
で、なにもないときはobjにnullが代入されるという感覚があったのだけれど、冷静に考えれば、try内でエラーが発生したら、そもそもobjに代入を行う前にその行の処理は終わってしまう。
したがって、以前のobjの値のままになるということ。
その結果、上の例だと★2が、意図したよりもたくさん実行される、みたいなことが起きてしまった。