TypeError: Error #1007: 嘗試個體化非建構函式。
前兩天遇到一個非常詭異的錯誤訊息:
"TypeError: Error #1007: 嘗試個體化非建構函式。"
若用 google 去查的話,可以找到一堆與 Document Class 相關的議題,不過這次我遇到的可不是那樣的問題。事實上,我遇到的問題正如他的錯誤訊息一樣的清楚,只不過難以發覺。
以下,我先準備一個我簡化過的問題案例:
Test.fla 的 Document Class 為 Test.as
package{
import flash.display.MovieClip;
import a.Vector;
public class Test extends MovieClip{
var v:Vector = new Vector();
public function Test(){
trace(123, v);
}
}
}
在這個 Test.as 中,有用到一個 package a 下的 Vector 類別:
package a{
public class Vector{
public function Vector(){
trace("Vector!!");
}
}
}
這個案例,若是發佈成 Flash Player 9 的話,一點問題也沒有,但若是發佈成 Flash Player 10 的話,就會出現錯誤訊息:
TypeError: Error #1007: 嘗試個體化非建構函式。
at Test()
我查了許久後,才發現問題出在那個 a.Vector,因為在 Flash Player 10 還沒推出時,Flash Player 還沒有內建 Vector 類別,所以當我們寫 var v:Vector = new Vector(); 時,可以由 import a.Vector (或 import a.*) 中找到這個 Vector 類別。可是到了 Flash Player 10 之後,會先找到的是全域類別物件 Vector,就像 String、Number 一樣,而不是我們自訂的 a.Vector 類別。
然而因為 Flash Player 10 新具備的 Vector 類別並不具有 "不帶參數的建構式",所以就會出現 "嘗試個體化非建構函式" 的錯誤訊息啦!
如果你們家的 Flash 程式,你或前人也有從不知道哪裡找來的 Vector 類別的話,或是任何改寫自其他程式語言 (Java) 的常用類別的話,未來都很有可能遇到這種同名的衝突問題。
解決方法一,將 Test.as 改寫成:
package{
import flash.display.MovieClip;
import a.Vector;
public class Test extends MovieClip{
var v:a.Vector = new a.Vector();
public function Test(){
trace(123, v);
}
}
}
使用自訂的 Vector 類別時,請明確指出完整路徑 var v:a.Vector = new a.Vector(); 即可。
解決方法二,將自訂的 Vector 類別重構一下,改名ㄅㄟ,反正現在的開發工具都很方便,重構時會協助你將所有已經使用到的程式碼都一起更新,除非你是使用 "字串轉類別" 的作法。
2 意見:
我個人習慣class命名,儘量不要和一般程式(java、.Net、C之類)重複到。
這樣有時候可以省去一些很多察覺到的麻煩。
我個人的習慣則是,能自己寫的程式就儘量自己寫,不然無法知道錯誤發生在哪裡。但若遇到需要維護前人寫的程式的時候,就只好加強自己除錯、重構的能力了。
張貼意見