すぐに固まるパソコンを使う。

すぐに固まるパソコンを使って色々します(実はそんなすぐでもない)。基本的にプログラミング系が多いです。たまに違うことします。

Immediately Freeze!

重くなるUnity 34 throwとcatch 「エクステンド!!7」

MeshEditorVerticesUVを追加した時に出る「NullReferenceException」について解説します。

 

エラーは全体的にこうなっています。

NullReferenceException: Object reference not set to an instance of an object
KplaMeshEditor.AddParts (System.String Title, System.String parts, System.String pname) (at Assets/The Heyas Assets/Editor/KplaMeshEditor.cs:103)
KplaMeshEditor.Editor () (at Assets/The Heyas Assets/Editor/KplaMeshEditor.cs:55)
KplaMeshEditor.OnGUI () (at Assets/The Heyas Assets/Editor/KplaMeshEditor.cs:44)
System.Reflection.MonoMethod.Invoke (System.Object obj, BindingFlags invokeAttr, System.Reflection.Binder binder, System.Object[] parameters, System.Globalization.CultureInfo culture) (at /Users/builduser/buildslave/mono-runtime-and-classlibs/build/mcs/class/corlib/System.Reflection/MonoMethod.cs:222)

 

実際のエラーの内容が1行目に有り、その後はクラス内のメソッドが書いてあります。

エラーは、「オブジェクトの参照にインスタンスが設定されていない」ということです。つまり、値が設定されていないのに実行しようとすると出てくるエラーです。

 

このようなエラーは、「Exception」と呼ばれています。実は、スクリプトでも出せます。

 

Script:ErrorSample.cs

gist.github.com

解説

Errorの出し方です。C#にはExceptionクラスが有り、UnityにはUnityExceptionクラスがあります。どちらも同じようなものです。(たぶん)

throw」の先で宣言できます。*1

 

tryでは「例外処理」が行われています。これは、とりあえず「試す」ことで、もし何か「例外」(Exception)が起きたら、「キャッチ(catch)」してもらいます。

 

また、Errorが出た時、色々とクラスがあるのは、Errorのもととなるメソッドなどを当てています。(at ~~)こちらの間違えがどこにあるかわかるので、便利です。

 

今回のNullReferenceExceptionは値がnullであるということなので、値をいじってDebug.Log()に流すようにしました。すると、、、

f:id:norlself66:20150504212543p:plain

このように、値はしっかり変わって居るようです。なので、配列にAddするところで問題があるようです。

 

ArrayListというのが配列を使うときに使えると言いましたが、実はArrayListはすべてを「Object」という方に変換しているために、エラーが起きやすいです。そこで、もう一つの配列の方法を使いたいと思います。(それで直るかは不明)

*1:throwthrows違うものです。間違えないように