トップページ
>
ツクール関連テキスト
> RGSSエラー対策
RGSSエラー対策
Syntax Error
ゲーム開始直後にチェックされる文法エラー。修正はそれほど難しくない。
◆制御構造の記述ミス
"if"や"for"と"end"がペアになっていない場合に発生する。別の場所や素材サイトからペーストした時に陥りやすいのでその場合は要チェック。
◆全角文字の使用
注釈及び文字列外での全角文字の使用はエラー。全角スペースは、見付けにくいので注意。RGSSの場合は問題の箇所にカーソルが勝手に移動してくれるので対処しやすい。
なお、文字列の閉じ忘れでも同じくエラーになる。
◆優先順位に関するミス
例えば "return @a or @b" は問題なさそうだがこれもエラーになる。原因は優先順位で命令を解釈する際に"return @a"と"or @b"で分けてしまうために"or @b"でエラーになる。これは"+"と"*"の関係と同様と言える。
よって対策は"return (@a or @b)"と書き直すこと。"return @a || @b"でもよい。これは"or"及び"return"より"||"の方が優先順位が高いせいである。
◆擬似変数に代入
"self" "true" "false"に代入しようするとエラーになる。"true" "false"に対してそんなことはしないだろうが、クラス内で自分自身のオブジェクトを書き換えようとして"self=@a"などと記述することはできない。
◆スクリプトを書き掛けの状態で実行
スクリプトを書き掛けのまま別の場所の編集に取り掛かるなどで書き掛けであることを忘れたままテストプレーするとエラーになる。なにげによくある。
Name Error
未定義のオブジェクトを参照することにより発生するエラー。
◆nilについて
未定義のオブジェクトにはnilが入っているからメソッドの引数などに未定義のオブジェクトを使用しても問題はない、というのは間違いでこれをやるとエラーになる。だが、"a==nil"などの判定式に用いる場合は未定義でも構わないので注意が必要。
◆イベントコマンドでスクリプトを使用する際の注意点
イベント内で定義したローカルオブジェクトを同じイベントコード内の別のスクリプトコマンドで参照することはできない。たとえスクリプトコマンドが連続していてもダメ。
どうしても使いたい場合は先頭に"@"を付けてインスタンスとして定義しておけばエラーは発生しないがイベントコマンド内でオブジェクトを定義するのは処理が分かりにくくなるになるのでオススメできない。
複雑な処理はスクリプトの方に記述してイベント内ではメソッドの呼び出しや変数の参照に留めるのが無難だ。
◆スペルミス
エラーの中でも、もっとも発生頻度が高いのがこれが原因のエラーだったりする。参照時のスペルミスなら発見しやすいが、定義時にスペルミスしている場合は原因がカーソルとは別の場所にあるので見付けにくい。
エラーが起こって原因に心当たりがなければまずこれを確認しよう。
NoMethodError
存在しないメソッドの呼び出しで発生するエラー
◆関数形式によるもの
メソッドの呼び出し方には大きく分けて"通常形式"と"関数形式"がある(もうひとつあるけど関係ないので省略)。関数形式とはそのままメソッド名だけを記述して呼び出す形式。記述したクラス内及びその親クラス、インクルードしたモジュールのメソッドを呼び出す場合にのみ使用できる。
エラーにはならないが、呼び出したいメソッドと同名のローカルオブジェクトが既に存在する場合はそちらを優先してしまう点に注意が必要。その場合は通常形式での呼び出しに書き換えれば問題なく動作する。
◆通常形式によるもの
通常形式とは"オブジェクト名.メソッド名"で呼び出す形式。クラス内のメソッドを呼び出したい場合はオブジェクト名のところを"self"と記述する。
この形式でエラーが発生した場合はそのオブジェクトにはそんな名前のメソッドはありません、ということ。
まず確認すべきはそのオブジェクトが期待するクラスのオブジェクトであるかどうかだ。オブジェクトがクラス"A"に属していると思ってメソッドを書いたのに実行時にはそのオブジェクトはクラス"B"に属していたためエラー、ということも考えられる。
TypeError
オブジェクトの型が要求されたものと異なる場合に発生するエラー
◆演算、比較する際に発生するもの
"a=b"などと記述する場合はaとbがどのようなものでも(aが書き換え可能ならば)TypeErrorは発生しない。しかし"a+=b"や"c=a+b"などの演算の場合はaとbの型が同じでなければならない。
ちなみに、"a+b"はaのオブジェクトが属するクラスが持つメソッドのひとつで"b"が引数である。
◆組み込みクラスのメソッドを呼び出す際に発生するもの
組み込みクラスのメソッドは引数の型をあらかじめ指定しているものが多い。リファレンスをよく読んでどのようなオブジェクトが引数に必要なのかを把握してから使うこと。
ありがちなのが文字列が引数として要求されているのに、数値を引数に指定してエラーになること。対処法は数値のクラスであるNumericクラスのメソッド".to_s"を用いて文字列に変換する。式展開"#{a}"を使って文字列に変換する。組み込み関数sprintfを使って文字列に変換する、などが挙げられる。
数値をそのまま文字列にしたい場合は"to_s"、文字列中に埋め込みたい場合は後の二つの方法を使うとよい。
◆2次元配列に関する注意点
RGSSでは2次元配列は二通りの方法で実現できる。ひとつは通常の方法で配列の要素が配列になっているもの。もう一つは組み込みクラスであるTableクラスを用いたものだ。プリセットのスクリプトには両方が使われているため分かりにくいので注意が必要だ。
ArgumentError
メソッドを呼び出した際に引数の数がメソッドが指定したものと異なる場合に発生するエラー。組み込みクラスのメソッドを用いた際に発生した場合はTypeErrorの時と同様に、リファレンスの該当箇所をきちんと読み直せば答えが見付かるはず。
◆オーバーライド時の注意点
メソッド中で親クラスの同名のメソッドを呼び出すことをオーバーライドと言って、RGSSではsuperを用いて記述するのだが単に"super"と記述すると"super"が記述されたメソッドに指定した引数をそのまま指定してしまい、それが原因でエラーになる場合がある。
引数を渡したくないときは"super()"というように記述する必要がある。
その他のエラー
その他のエラーの中で頻繁に発生することが予想されるものをまとめてみた。
◆SystemStackError
主にエンドレスな再帰的定義(メソッド中で同じメソッドを呼び出すこと)により発生する。再帰的定義は繰り返し処理を実現するための方法の一つとして用いられるのだがその際の処理に問題があると繰り返しが永遠に終わらずにエラーになる。
通常の繰り返し処理と異なりローカルなカウンタ変数を用いることが出来ない点に注意。呼び出し回数を記憶したい場合は回数を引数に指定するとよい。
◆LocalJumpError
特定の制御構造外でbreakなどを使用で発生するエラー。ifやforとendのペアに問題がないかをもう一度チェックしてみるといい。
◆ZeroDivisionError
"0"による除算で発生するエラー。ゲージを表示する際などに現在値を最大値で割ることで割合を求めることがよくあるがその時、最大値が0の時などによく発生する。最大値が0の時とそうでない時とでの場合分けが必要。
◆RGSSError
disposeメソッドを用いて既に解放したスプライトやビットマップ、ウィンドウなどに"dispose"や"disposed?"以外のメソッドを使用すると発生する。困ったことに原因がカーソルの箇所とは別の場所にあることが多いので原因を探しづらい。
◆スクリプトのハングアップ
whileなどの繰り返しが永遠に終わらない場合などに発生する。終了条件やカウンタ変数の加算に問題が無いかのチェックはもちろん、("i"などの)カウンタ用の変数の重複使用にも注意。ローカル変数はメソッド終了まで値が保存されるので複数の繰り返しで同じ変数を用いるとハングアップする可能性がある。
おまけ
エラーに関するおまけの文章
◆意図的にエラーを発生させてみる
エラーを理解するひとつの方法として自分でわざとエラーを発生させてみる、というのがある。エラーがどのような条件下で発生するのかを理解しておけば実際にエラーに遭遇したときも対処しやすい。
◆異常継続より異常終了の方がマシ
何らかの原因で問題が発生した場合はそのまま処理を続けることで問題の原因が分からなくなったり更に大きな異常を引き起こす原因になったりする。それならエラーを発生させて終了した方がいい。
例えばメソッドの引数に想定外のオブジェクトが渡された時に備えてエラーが発生しないような処置を施すことがあるが、想定外のオブジェクトが渡された時点で異常が発生したと言えるので無理にエラーを回避するよりはエラーを発生させてその都度、原因を突き止めておいたほうがよい。
◆"p"を用いたデバッグ
"p"という組み込み関数があるがこれはデバッグに利用できる。その時点であるオブジェクトがどのような値なのかを調べることができるし、処理がどのような道筋を辿っているかをチェックすることもできる。
◆"eval"を用いる際の注意点
"eval"関数は引数として指定した文字列をRubyプログラムとして実行してくれるありがたい関数だがそれを実行中にエラーが発生すると原因を突き止めにくい。通常は開始時にチェックされるSyntaxErrorもチェックされないのであまり複雑な処理は避けた方がいいかも知れない。
トップページ
>
ツクール関連テキスト
> RGSSエラー対策