静的型 %1 の値が、関連しない可能性が高い型 %2 に暗黙で型

ERROR
1118
★ 種 類 … コンパイルエラー
エラー ID:1118
発生頻度
★ カテゴリ … 型変換
01
基礎知識
静的型 %1 の値が、関連しない可能性が高い型 %2
に暗黙で型変換されています。
—
> I m p l i c i t c o e rc i o n of a va l u e w i t h s t a t i c t y p e % 1 t o a p o s s i b l y u n re l a t e d t y p e
%2.
AS3 の厳密な型指定では、型指定された変数に、その型のスーパークラスの値を代入しようとす
るとエラーになります。これは暗黙の型変換が失敗するためです。代入するためには適切な型を
指定するか、明示的な型変換を行う必要があります。
コンパイルエラー
02
主な原因
—
1. 代入しようとする値が、代入先の変数の型と厳密に一致していない。
解決法
1a.代入しようとする値に合わせて、代入先の変数の型を指定する。
1b.代入先の変数の型が、代入しようとする値のサブクラスであり、かつ信頼できる(バグを引き起
こす可能性がない)ものである場合は、as 演算子を用いて明示的型変換を行うこともできる。
サンプル 1
03
修正後
—
class SuperClass {}
class SubClass extends SuperClass {}
var a:SuperClass = new SuperClass();
var a:SuperClass = new SuperClass();
var b:SuperClass = a;
// 代入先の変数の型を変更
原因 1
var b:SubClass = a;
/* エラー 1118: 静的型 SuperClass の値が、関連しない可
能性が高い型 SubClass に暗黙で型変換されています。 */
コンパイ ラ 警 告
修正前
class SuperClass {}
class SubClass extends SuperClass {}
サンプル 2
修正前
原因 1
ポイント
修正後
04
var example:Sprite = addChild(new Sprite()) as Sprite;
/* as 演算子を用いて、DisplayObject.addChild() の戻り値を明示
的に Sprite に変換することでエラーを回避 */
アップキャストとダウンキャスト
ランタイムエラー
var example:Sprite = addChild(new Sprite());
/* DisplayObject.addChild() の戻り値は DisplayObject
型なので、Sprite 型の変数 example に代入するとエラー */
—
アップキャストとは、オブジェクトをそのスーパータイプのどれかにキャストすることです。一般
にランタイムエラーが起こりえない安全なキャストと言われます。
例 Sprite(new MovieClip());
ダウンキャストとは、オブジェクトをそのサブタイプのどれかにキャストすることです。ダウンキャ
例 MovieClip(new Sprite());
var mc:MovieClip = new Sprite as MovieClip; //null
Error ID : 1116 ---> 1118
A
AS2からの移 行
ストは as 演算子でサブクラスがスーパークラスを判断することができないため、null が返されます。
—
127
WARNING
1012
★ 種 類 … コンパイラ警告
警告 ID:1012
発生頻度
★ カテゴリ … 制限 / 禁止
01
基礎知識
%1 型の変数は undefined にすることができません。
値 undefined は %2 に型強制された後で比較されます。
—
> Va r i a b l e s of t y p e % 1 c a n n o t b e u n d e f i n e d . T h e va l u e u n d e f i n e d w i l l b e t y p e
c o e rc e d t o % 2 b e fo re c o m p a r i s o n .
undefined は、
* 型の変数(または型指定のない変数)もしくはダイナミックオブジェクトプロパティ
でのみ使用されます。それ以外のものと undefined を比較するとエラーになります。
コンパイルエラー
02
主な原因
—
1. * 型以外の変数と undefined を比較している。AS2 まではこのような記述をしても問題なかった
が、AS3 では警告扱いとなる。
解決法
1. undefined ではなく、それぞれの変数の型に適した初期値を使用する。または undefined を代入
する変数を * 型にする。
サンプル 1
03
修正後
原因 1
if (test == undefined) {
}
/* Warning: 1012: MovieClip 型の変数は undefined
にすることができません。値 undefined は MovieClip に型
強制された後で比較されます。 */
コンパイ ラ 警 告
修正前
var test:MovieClip;
—
var test:MovieClip; // 初期値は null
if (test == null) {
}
サンプル 2
修正前
修正後
ポイント
var test:* = undefined;
if (test == undefined) {
}
04
ランタイムエラー
原因 1
var test:MovieClip = undefined;
if (test == undefined) {
}
/* Warning: 1012: MovieClip 型の変数は undefined
にすることができません。値 undefined は MovieClip に型
強制された後で比較されます。 */
—
undefined
undefined は、初期化されていない型指定のない変数、または初期化されていないダイナミックオ
ブジェクトプロパティに適用される特殊な値です。AS2 と AS3 では undefined の取り扱いが異なっ
ているため注意が必要です。AS3 では、undefined はトップレベルに属する特殊な定数であり、型
その型に基づいた値に強制型変換されます(Boolean 型は false、Number 型は NaN、int 型または
uint 型は 0、それ以外の型は null に変換されます)。
ポイント
ダイナミック
A
AS2からの移 行
指定のない変数のみが undefined を保持できます。型指定された変数に undefined を代入すると、
—
コンパイルエラー 1189(p.171)を参照してください。
Warning ID : 1008 ---> 1012
189
ERROR
★ 種 類 … ランタイムエラー
2006 エラー ID:2006
01
基礎知識
—
発生頻度
★ カテゴリ … 制限 / 禁止
指定したインデックスが境界外です。
> T h e s u p p l i e d i n d ex i s o u t of b o u n d s.
メソッドなどに有効範囲外のインデックスを指定した場合に発生します。
主な原因
コンパイルエラー
02
—
1. 下記のメソッドで指定したインデックス値が、そのオブジェクトが持つ子(または長さ)の最大
値を超えている。
クラス
メソッド
DisplayObjectContainer getChildAt()、addChildAt()、removeChildAt()、setChildIndex()、
GroupElement
swapChildrenAt()
getElementAt()、getElementAtCharIndex()、groupElements()、
mergeTextElements()、replaceElements()、splitTextElement()、
コンパイ ラ 警 告
03
TextBlock
ungroupElements()
findNextAtomBoundary()、findNextWordBoundary()、findPreviousAtom
TextLine
Boundary()、findPreviousWordBoundary()、getTextLineAtCharIndex()
getAtomBidiLevel()、getAtomBounds()、getAtomCenter()、
TextFileld
EndIndex()、getAtomTextRotation()、getAtomWordBoundaryOnLeft()
getLineLength()、getLineMetrics()、getLineOffset()、getLineText()
getAtomGraphic()、getAtomTextBlockBeginIndex()、getAtomTextBlock
—
2. IDataOutput.writeUTF() ま た は ByteArray.writeUTF() メ ソ ッド に 渡 し た ス ト リ ン グ の 長 さ が
65535 を超えている。
解決法
1. 該当のメソッドに範囲内の値を指定する。子や長さが存在しない場合には指定できない。
04
ランタイムエラー
—
2. writeUTF() メソッドに渡すストリングの長さが 65535 を超えないようにする。
サンプル 1
修正前
修正後
var sprite:Sprite = new Sprite();
var child:Sprite = new Sprite();
原因 1
sprite.addChildAt(child,1);
//sprite にはまだ子がないのでインデックス 1 は不正
var sprite:Sprite = new Sprite();
var child:Sprite = new Sprite();
sprite.addChildAt(child,0);
//child を sprite の 1 つ目の子として追加
サンプル 2
AS2からの移 行
A
—
266
修正前
修正後
var byte:ByteArray = new ByteArray();
var str:String = "";
for (var i:int=0; i < 65536; i++) {
str += "a";
}
byte.writeUTF(str);
原因 2
var byte:ByteArray = new ByteArray();
var str:String = "";
for (var i:int=0; i < 65536; i++) {
str += "a";
}
if (str.length > 65535) {
str = str.substr(0,65535);
}
byte.writeUTF(str);
Error Archives for ActionScript 3.0