私はいくつかのコードを持っていて、それが実行されると、NullReferenceException
を投げます。
オブジェクト参照がオブジェクトインスタンスに設定されていません。
これはどういう意味ですか、このエラーを修正するために何ができますか?
もう1つのシナリオは、nullオブジェクトを 値型 にキャストしたときです。例えば、以下のコードは:
object o = null;
DateTime d = (DateTime)o;
それはキャストにNullReferenceException
を投げます。上記のサンプルでは非常に明白に見えますが、これは、所有していないコードからnullオブジェクトが返され、キャストが自動システムによって生成されるなど、 "遅延バインディング"の複雑なシナリオで発生する可能性があります。
この1つの例は、Calendarコントロールを持つこの単純なASP.NETバインディングフラグメントです。
<asp:Calendar runat="server" SelectedDate="<%#Bind("Something")%>" />
ここで、SelectedDate
は実際にはDateTime
型の - Calendar
Web Control型のプロパティであり、バインディングは完全にnullを返す可能性があります。暗黙のASP.NETジェネレータは、上記のキャストコードと同等のコードを作成します。これはASP.NETで生成されたコードを細かくコンパイルするため、発見が非常に困難なNullReferenceException
が発生します。
問題の変数が何も指していないことを意味します。私はこのように生成することができます:
SqlConnection connection = null;
connection.Open();
変数 "connection
"を宣言している間は何も指していないため、エラーになります。メンバ "Open
"を呼び出そうとすると、解決するための参照がなく、エラーが発生します。
このエラーを回避するには
object == null
で確認してください。JetBrainsのResharperツールは、null参照エラーの可能性があるコード内のすべての場所を識別するため、nullチェックを入れることができます。このエラーがバグの最大の原因、私見です。
それはあなたのコードがnullに設定されたオブジェクト参照変数を使用したことを意味します(すなわち、それは実際のオブジェクトインスタンスを参照しませんでした)。
エラーを防ぐために、nullになる可能性のあるオブジェクトは、使用する前にnullについてテストする必要があります。
if (myvar != null)
{
// Go ahead and use myvar
myvar.property = ...
}
else
{
// Whoops! myvar is null and cannot be used without first
// assigning it to an instance reference
// Attempting to use myvar here will result in NullReferenceException
}
シナリオに関係なく、原因は.NETでも常に同じであることに注意してください。
値が
Nothing
/null
である参照変数を使用しようとしています。参照変数の値がNothing
/null
の場合、それは実際にはヒープ上に存在するオブジェクトのインスタンスへの参照を保持していないことを意味します。変数に何かを割り当てたり、変数に割り当てられた値のインスタンスを作成したりしないか、手動で変数を
Nothing
/null
に設定するか、変数をNothing
/null
に設定する関数を呼び出しました。
スローされるこの例外の例は次のとおりです。あなたが何かをチェックしようとしているとき、それはnullです。
例えば:
string testString = null; //Because it doesn't have a value (i.e. it's null; "Length" cannot do what it needs to do)
if (testString.Length == 0) // Throws a nullreferenceexception
{
//Do something
}
インスタンス化されていないもの、つまり上記のコードに対してアクションを実行しようとすると、.NETランタイムはNullReferenceExceptionをスローします。
メソッドに渡されるものがnullではないとメソッドが予測した場合に通常は防御手段としてスローされるArgumentNullExceptionと比較して。
詳細情報はC#NullReferenceExceptionおよびNullパラメータにあります。
参照型を初期化しておらず、そのプロパティの1つを設定または読み取りたい場合は、 NullReferenceException がスローされます。
例:
Person p = null;
p.Name = "Harry"; // NullReferenceException occurs here.
変数がnullでないかどうかをチェックすることでこれを簡単に回避できます。
Person p = null;
if (p!=null)
{
p.Name = "Harry"; // Not going to run to this point
}
NullReferenceExceptionがスローされる理由を完全に理解するには、 値型 と 参照型 の違いを知ることが重要です。
そのため、 値型 を扱っている場合、NullReferenceExceptionsは not が発生することがあります。ただし、 参照型 を扱うときは注意を払う必要があります。
名前が示唆しているように、参照型だけが参照を保持したり、文字通り何も(または 'null')を指すことができません。値型は常に値を含みますが。
参照型(これらはチェックする必要があります):
値の型(これらは無視してもかまいません):
NullReferenceExceptions
が発生する可能性があるもう1つのケースは、 as
演算子 の(誤った)使用法です。
class Book {
public string Name { get; set; }
}
class Car { }
Car mycar = new Car();
Book mybook = mycar as Book; // Incompatible conversion --> mybook = null
Console.WriteLine(mybook.Name); // NullReferenceException
ここで、Book
とCar
は互換性のない型です。 Car
をBook
に変換/キャストすることはできません。このキャストが失敗すると、as
はnull
を返します。この後にmybook
を使用するとNullReferenceException
が発生します。
一般に、次のようにキャストまたはas
を使用する必要があります。
型変換が常に成功することを期待している場合(つまり、オブジェクトが前もってあるべきことがわかっている場合)、キャストを使用する必要があります。
ComicBook cb = (ComicBook)specificBook;
型がわからないが、それを特定の型として使用するためにtryを使用したい場合は、as
を使用します。
ComicBook cb = specificBook as ComicBook;
if (cb != null) {
// ...
}
whatが NullReferenceExceptions を引き起こし、avoid/fixに近づく一方で、このような例外は他で対処されています回答、多くのプログラマーがまだ学んでいないことは、開発中にそのような例外を独立してdebugする方法です。
Visual Studioでは、通常、これは Visual Studio Debugger のおかげで簡単です。
最初に、正しいエラーがキャッチされることを確認します-参照してください VS2010で 'System.NullReferenceException'でブレークを許可するにはどうすればよいですか?1
次に、 Starting with Debugging(F5) または Attach [the VS Debugger] to Running Process 。 Debugger.Break
を使用すると便利な場合があります。これにより、デバッガの起動が要求されます。
これで、NullReferenceExceptionがスロー(または未処理)されると、デバッガーは例外が発生した行で停止します(上記のルールを覚えていますか?)。エラーを簡単に発見できる場合があります。
たとえば、次の行で、canが例外を発生させる唯一のコードは、myString
がnullと評価された場合のみです。これは Watch Window を見るか、 Immediate Window で式を実行することで確認できます。
var x = myString.Trim();
次のようなより高度なケースでは、上記の手法(ウォッチウィンドウまたはイミディエイトウィンドウ)のいずれかを使用して式を調べ、str1
がnullであるか、str2
がnullであるかを判断する必要があります。
var x = str1.Trim() + str2.Trim();
where例外がスローされると、通常、後方に推論してnull値が[誤って]導入された場所を見つけるのは簡単です-
例外の原因を理解するのに必要な時間をかけてください。 null式を検査します。そのようなヌル式をもたらす可能性のある以前の式を調べてください。 breakpoints を追加し、必要に応じてプログラムをステップ実行します。 デバッガーを使用します。
1 Break on Throwsが非常に積極的であり、デバッガが.NETまたはサードパーティライブラリのNPEで停止する場合、キャッチされる例外を制限するために Break on User-Unhandled を使用できます。さらに、VS2012では Just My Code を導入しています。これも有効にすることをお勧めします。
Just My Codeを有効にしてデバッグしている場合、動作はわずかに異なります。 Just My Codeを有効にすると、デバッガーはMy Codeの外部でスローされ、My Codeをパススルーしない最初の共通言語ランタイム(CLR)例外を無視します
Null値参照を含むオブジェクトを使用しています。だから、それはnull例外を与えています。この例では、文字列値はnullであり、その長さを確認すると例外が発生しました。
例:
string value = null;
if (value.Length == 0) // <-- Causes exception
{
Console.WriteLine(value); // <-- Never reached
}
例外エラーは次のとおりです。
未処理の例外:
System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 Program.Main()で
object o = null;
DateTime d = (DateTime)o; // NullReferenceException
nboxing変換(キャスト)fromobject
(またはクラスSystem.ValueType
のいずれかから) System.Enum
、またはインターフェイス型から)to値型(Nullable<>
以外)自体がNullReferenceException
を提供します。
他の方向では、boxing変換fromHasValue
がfalse
に等しいNullable<>
- to参照型。null
参照を与えることができ、後でNullReferenceException
に導くことができます。典型的な例は次のとおりです。
DateTime? d = null;
var s = d.ToString(); // OK, no exception (no boxing), returns ""
var t = d.GetType(); // Bang! d is boxed, NullReferenceException
ボクシングは別の方法で行われることもあります。たとえば、次の非汎用拡張メソッドの場合:
public static void MyExtension(this object x)
{
x.ToString();
}
次のコードには問題があります。
DateTime? d = null;
d.MyExtension(); // Leads to boxing, NullReferenceException occurs inside the body of the called method, not here.
これらのケースは、Nullable<>
インスタンスをボックス化するときにランタイムが使用する特別なルールが原因で発生します。
エンティティフレームワークで使用されるエンティティのクラス名が、Webフォームのコードビハインドファイルのクラス名と同じである場合の追加.
コードビハインドクラスがContactであるWebフォームContact.aspxがあり、エンティティ名Contactがあるとします。
その場合、context.SaveChanges()を呼び出すと、次のコードでNullReferenceExceptionがスローされます。
Contact contact = new Contact { Name = "Abhinav"};
var context = new DataContext();
context.Contacts.Add(contact);
context.SaveChanges(); // NullReferenceException at this line
完全を期すためにDataContextクラス
public class DataContext : DbContext
{
public DbSet<Contact> Contacts {get; set;}
}
連絡先エンティティクラス。エンティティクラスは部分クラスであるため、他のファイルでも拡張できます。
public partial class Contact
{
public string Name {get; set;}
}
エンティティと分離コードクラスの両方が同じ名前空間にある場合、エラーが発生します。これを修正するには、Contact.aspxのエンティティクラスまたは分離コードクラスの名前を変更します。
理由 まだその理由がわからない。しかし、いずれかのエンティティクラスがSystem.Web.UI.Pageを継承するたびに、このエラーが発生します。
議論のために DbContext.saveChanges()のNullReferenceExceptionを見てください
この例外を受け取る可能性があるもう1つの一般的なケースは、ユニットテスト中にクラスをモックすることです。使用されているモックフレームワークに関係なく、クラス階層のすべての適切なレベルが正しくモックされていることを確認する必要があります。特に、テスト対象のコードで参照されているHttpContext
のすべてのプロパティはモックする必要があります。
やや冗長な例については、「 カスタムAuthorizationAttributeをテストするときにスローされる/ NullReferenceException 」を参照してください。
私はこれに答えるために別の見方をしています。この種の答えは "それを避けるために他に何ができるか? "
たとえばMVCアプリケーションで、 さまざまなレイヤーにまたがって を操作する場合、コントローラーはビジネスオペレーションを呼び出すサービスを必要とします。このようなシナリオでは、 依存性注入コンテナ を使用して、 NullReferenceException を回避するようにサービスを初期化できます。つまり、nullをチェックする必要はなく、コントローラからサービスを呼び出すだけで、それらがシングルトンまたはプロトタイプとして常に使用可能(および初期化済み)になるようにすることができます。
public class MyController
{
private ServiceA serviceA;
private ServiceB serviceB;
public MyController(ServiceA serviceA, ServiceB serviceB)
{
this.serviceA = serviceA;
this.serviceB = serviceB;
}
public void MyMethod()
{
// We don't need to check null because the dependency injection container
// injects it, provided you took care of bootstrapping it.
var someObject = serviceA.DoThis();
}
}
「それについてどうすればよいか」については、多くの答えがあります。
このようなエラー状態を防ぐためのより「正式な」方法開発中は、契約による設計コード内。これは、クラスinvariants、および/またはfunction/methodpreconditionsおよびpostconditionsシステムの開発中。
要するに、class invariantsは、通常の使用で違反しないクラスの制約があることを確認します(したがって、クラスはnot一貫性のない状態になる。Preconditionsは、関数/メソッドへの入力として与えられるデータがいくつかの制約セットに従う必要があることを意味し、neverそれらに違反し、postconditionsは、関数/メソッドの出力がそれらに決して違反することなく、設定された制約に従う必要があることを意味します。契約条件は、バグのないプログラムの実行中はneverに違反する必要があるため、契約による設計は、デバッグモードで実際にチェックされ、releasesで無効化。開発されたシステムパフォーマンスを最大化します。
これにより、制約セットの違反の結果であるNullReferenceException
ケースを回避できます。たとえば、クラスでオブジェクトプロパティX
を使用し、後でそのメソッドの1つを呼び出そうとして、X
がnull値を持つ場合、これはNullReferenceException
になります。
public X { get; set; }
public void InvokeX()
{
X.DoSomething(); // if X value is null, you will get a NullReferenceException
}
ただし、メソッドの前提条件として「プロパティXにNULL値を含めることはできません」を設定すると、前述のシナリオを防ぐことができます。
//Using code contracts:
[ContractInvariantMethod]
protected void ObjectInvariant ()
{
Contract.Invariant ( X != null );
//...
}
このため、。=アプリケーションにはCode Contractsプロジェクトが存在します。
または、assertionsを使用して、契約による設計を適用できます。
UPDATE:この用語はBertrand Meyerによって作られたものであることに言及する価値があります Eiffelプログラミング言語の設計に関連して 。
NullオブジェクトのPropertiesにアクセスしようとしているとき、または文字列値が空になり、文字列メソッドにアクセスしようとしているときにNullReferenceException
がスローされます。
例えば:
空文字列の文字列メソッドにアクセスした場合
string str = string.Empty;
str.ToLower(); // throw null reference exception
Nullオブジェクトのプロパティがアクセスした場合
Public Class Person {
public string Name { get; set; }
}
Person objPerson;
objPerson.Name /// throw Null refernce Exception
TL; DR: Renderpage
の代わりにHtml.Partial
を使用してみてください
このように、Modelを送信してView内でViewをレンダリングしようとしたとき、私はObject reference not set to an instance of an object
を取得していました。
@{
MyEntity M = new MyEntity();
}
@RenderPage("_MyOtherView.cshtml", M); // error in _MyOtherView, the Model was Null
デバッグにより、モデルがMyOtherView内でNullであることが示されました。私がそれを変更するまで:
@{
MyEntity M = new MyEntity();
}
@Html.Partial("_MyOtherView.cshtml", M);
そしてそれはうまくいった。
さらに、最初からHtml.Partial
を持っていなかったのは、実際にはエラーではないにもかかわらず、異なる方法で作成されたforeach
ループの中にある場合、Visual Studio 時々 はHtml.Partial
の下にエラーに見えるしわがれた線を投げるからです。
@inherits System.Web.Mvc.WebViewPage
@{
ViewBag.Title = "Entity Index";
List<MyEntity> MyEntities = new List<MyEntity>();
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
MyEntities.Add(new MyEntity());
}
<div>
@{
foreach(var M in MyEntities)
{
// Squiggly lines below. Hovering says: cannot convert method group 'partial' to non-delegate type Object, did you intend to envoke the Method?
@Html.Partial("MyOtherView.cshtml");
}
}
</div>
しかし、私はこの「エラー」に問題なくアプリケーションを実行することができました。 foreach
ループの構造を次のように変更することで、エラーを取り除くことができました。
@foreach(var M in MyEntities){
...
}
Visual Studioがアンパサンドと角かっこを誤解していたためだと感じました。
あなたはそれについて何ができますか?
Null参照とは何か、そしてそれをデバッグする方法を説明している多くの良い答えがここにあります。しかし、この問題を防ぐ方法、あるいは少なくともそれを捕らえやすくする方法はほとんどありません。
引数をチェックする
たとえば、メソッドは異なる引数をチェックしてそれらがnullかどうかを確認し、ArgumentNullException
をスローします。これは、この目的のために明らかに作成された例外です。
ArgumentNullException
のコンストラクタは引数としてパラメータの名前とメッセージさえも取りますので、開発者に問題が何であるかを正確に伝えることができます。
public void DoSomething(MyObject obj) {
if(obj == null)
{
throw new ArgumentNullException("obj", "Need a reference to obj.");
}
}
ツールを使う
役に立つことができるいくつかのライブラリもあります。たとえば、 "Resharper"は、あなたがコードを書いている間、特にあなたがそれらの属性を使う場合、警告をあなたに提供することができます: NotNullAttribute
ランタイムチェックとコンパイルチェックを可能にするContract.Requires(obj != null)
のような構文を使う "Microsoft Code Contracts"があります: コード規約の紹介 。
"PostSharp"もあります。これを使うと、このような属性を使うことができます。
public void DoSometing([NotNull] obj)
それを行い、PostSharpをビルドプロセスの一部にすることで、obj
は実行時にnullがないかチェックされます。参照してください: PostSharp nullチェック
プレーンコードソリューション
それとも、あなたはいつも普通の古いコードを使ってあなた自身のアプローチをコーディングすることができます。たとえば、ここにnull参照を捕捉するために使用できる構造体があります。これはNullable<T>
と同じ概念に基づいてモデル化されています。
[System.Diagnostics.DebuggerNonUserCode]
public struct NotNull<T> where T: class
{
private T _value;
public T Value
{
get
{
if (_value == null)
{
throw new Exception("null value not allowed");
}
return _value;
}
set
{
if (value == null)
{
throw new Exception("null value not allowed.");
}
_value = value;
}
}
public static implicit operator T(NotNull<T> notNullValue)
{
return notNullValue.Value;
}
public static implicit operator NotNull<T>(T value)
{
return new NotNull<T> { Value = value };
}
}
null
を許可しないために、まったく反対のことを達成するという目的を除いて、Nullable<T>
を使用するのと同じ方法を使用します。ここではいくつかの例を示します。
NotNull<Person> person = null; // throws exception
NotNull<Person> person = new Person(); // OK
NotNull<Person> person = GetPerson(); // throws exception if GetPerson() returns null
NotNull<T>
はT
との間で暗黙的にキャストされているため、必要な場所ならどこでも使用できます。たとえば、Person
オブジェクトをNotNull<Person>
を取るメソッドに渡すことができます。
Person person = new Person { Name = "John" };
WriteName(person);
public static void WriteName(NotNull<Person> person)
{
Console.WriteLine(person.Value.Name);
}
Null許容値の場合と同じように、Value
プロパティを介して基礎となる値にアクセスします。あるいは、明示的キャストまたは暗黙的キャストを使用できます。以下の戻り値を持つ例を見ることができます。
Person person = GetPerson();
public static NotNull<Person> GetPerson()
{
return new Person { Name = "John" };
}
あるいは、キャストを実行してメソッドがT
(この場合はPerson
)を返すときにも使用できます。たとえば、次のコードは上記のコードとまったく同じです。
Person person = (NotNull<Person>)GetPerson();
public static Person GetPerson()
{
return new Person { Name = "John" };
}
拡張子と組み合わせる
NotNull<T>
を拡張メソッドと組み合わせると、さらに多くの状況をカバーできます。拡張メソッドがどのように見えるかの例を示します。
[System.Diagnostics.DebuggerNonUserCode]
public static class NotNullExtension
{
public static T NotNull<T>(this T @this) where T: class
{
if (@this == null)
{
throw new Exception("null value not allowed");
}
return @this;
}
}
そして、これがその使い方の例です。
var person = GetPerson().NotNull();
GitHub
ご参考までに、私はGitHubで上記のコードを公開しました。
https://github.com/luisperezphd/NotNull
関連言語機能
C#6.0は、これを少し手助けする "null条件付き演算子"を導入しました。この機能を使用すると、ネストしたオブジェクトを参照でき、それらのいずれかがnull
であれば、式全体がnull
を返します。
これにより、場合によっては、ヌルチェックの回数が減ります。構文は各ドットの前に疑問符を付けることです。例えば次のようなコードを見てください。
var address = country?.State?.County?.City;
country
がCountry
というプロパティを持つState
型のオブジェクトであるとします。 country
、State
、County
、またはCity
がnull
である場合、address will be
null. Therefore you only have to check whether
addressis
null`です。
これは素晴らしい機能ですが、情報が少なくて済みます。 4のうちどれがnullであるかは明らかではありません。
NULL可能のような組み込み?
C#にはNullable<T>
のNiceの省略形があります。そのようにint?
のようにタイプの後に疑問符を置くことで何かをnullにすることができます。
C#に上記のNotNull<T>
構造体のようなものがあり、同様の速記、おそらく感嘆符(!)があれば、public void WriteName(Person! person)
のように書くことができます。
C#6のNull条件付き演算子を使用してNullReferenceExceptionをクリーンな方法で修正し、nullチェックを処理するコードを少なくすることができます。
メンバーアクセス(?。)またはインデックス(?[)操作を実行する前にnullをテストするために使用されます。
例
var name = p?.Spouse?.FirstName;
以下と同等です。
if (p != null)
{
if (p.Spouse != null)
{
name = p.Spouse.FirstName;
}
}
その結果、pがnullの場合、またはp.Spouseがnullの場合、名前はnullになります。
それ以外の場合、変数名にはp.Spouse.FirstNameの値が割り当てられます。
詳細情報: NULL条件演算子
エラー行 "オブジェクト参照がオブジェクトのインスタンスに設定されていません。"は、インスタンスオブジェクトをオブジェクト参照に割り当てていないにもかかわらず、そのオブジェクトのプロパティ/メソッドにアクセスしていることを示しています。
たとえば、myClassというクラスがあり、その中にプロパティprop1が1つ含まれているとします。
public Class myClass
{
public int prop1 {get;set;}
}
今、あなたは以下のように他のクラスでこのprop1にアクセスしています。
public class Demo
{
public void testMethod()
{
myClass ref = null;
ref.prop1 = 1; //This line throws error
}
}
myClassクラスの参照は宣言されているがインスタンス化されていないか、objectのインスタンスがそのクラスの参照に割り当てられていないため、上記の行はエラーをスローします。
これを修正するには、インスタンス化する必要があります(そのクラスの参照にオブジェクトを割り当てます)。
public class Demo
{
public void testMethod()
{
myClass ref = null;
ref = new myClass();
ref.prop1 = 1;
}
}
興味深いことに、このページの答えはいずれもEdgeの2つのケースについて言及していません。それらを追加しても気にしないでください。
.NETの総称辞書はスレッドセーフではなく、2つの並行スレッドからキーにアクセスしようとすると 時に NullReference
、さらには(より頻繁に)KeyNotFoundException
をスローすることがあります。この場合、例外は非常に誤解を招きやすいです。
NullReferenceException
がunsafe
コードによって投げられるなら、あなたはあなたのポインタ変数を調べて、そしてそれらがIntPtr.Zero
か何かのためにチェックするかもしれません。これは同じことですが( "null pointer exception")、安全でないコードでは、変数はvalue-types /配列などにキャストされることが多く、value-typeがどのようにこれをスローするのか疑問に思います。例外。
(さて、あなたがそれを必要としない限り安全でないコードを使用しないもう一つの理由は、)
使用しようとしているクラスのオブジェクトがインスタンス化されていない場合、NullReferenceExceptionまたはオブジェクトのインスタンスに設定されていないオブジェクト参照が発生します。例えば:
Studentという名前のクラスがあるとします。
public class Student
{
private string FirstName;
private string LastName;
public string GetFullName()
{
return FirstName + LastName;
}
}
さて、あなたが生徒のフルネームを取得しようとしている別のクラスを考えてみましょう。
public class StudentInfo
{
public string GetStudentName()
{
Student s;
string fullname = s.GetFullName();
return fullname;
}
}
上記のコードで見られるように、ステートメント Student s - はStudent型の変数のみを宣言します。この時点ではStudentクラスはインスタンス化されていません。したがって、 s.GetFullName() というステートメントが実行されると、NullReferenceExceptionがスローされます。
簡単に言えば、
作成されていない、または現在メモリ内にないオブジェクトにアクセスしようとしています。
だからこれに取り組む方法:
デバッグしてデバッガを中断させます...中断された変数に直接移動します。これで問題は簡単に解決できます。適切な場所で new キーワードを使用することです。
オブジェクトが存在しないためにいくつかの database コマンドが原因で発生した場合は、nullチェックを行って処理するだけです。
if (i == null) {
// Handle this
}
最も難しいのは、_ gc _がすでにオブジェクトを収集している場合です。これは通常、文字列を使用してオブジェクトを検索しようとしている場合です。オブジェクトの場合、GCがすでにクリーンアップしている可能性があります...これは見つけるのが難しく、かなり問題になるでしょう...これに取り組むためのより良い方法は、開発プロセス中に必要に応じてnullチェックを行うことです。これはあなたに多くの時間を節約するでしょう。
名前で見つけることによって、私はいくつかのフレームワークがあなたが文字列を使ってオブジェクトを見つけることを可能にし、コードがこのように見えるかもしれないことを意味します: FindObject( "ObjectName");
NullReferenceExeptionを修正する最も簡単な方法は文字通り2つの方法です。たとえば、スクリプトが添付されたGameObjectとrb(rigidbody)という名前の変数がある場合、ゲームを開始するとこの変数はnullで始まります。
これは、コンピュータがその変数にデータを格納していないためにNullReferenceExeptionを受け取る理由です。
例としてRigidBody変数を使用します。
データを簡単に追加する方法はいくつかあります。
rb = GetComponent<Rigidbody>();
とタイプしてください。Start()
またはAwake()
関数の下で最もうまく機能します。rb = AddComponent<RigidBody>();
その他の注意:オブジェクトにコンポーネントを追加したいが、コンポーネントを追加するのを忘れた場合は、クラス宣言の上に[RequireComponent(typeof(RigidBody))]
と入力します(すべての用途の下のスペース)。
ゲームを楽しんで楽しんでください!
この例外がスローされる可能性がある一般的なシナリオを考慮すると、オブジェクトを先頭にしてプロパティにアクセスします。
例:
string postalcode=Customer.Address.PostalCode;
//if customer or address is null , this will through exeption
ここで、addressがnullの場合、NullReferenceExceptionが発生します。
そのため、実際には、そのようなオブジェクトのプロパティにアクセスする前に、常にnullチェックを使用する必要があります(特に総称的に)。
string postalcode=Customer?.Address?.PostalCode;
//if customer or address is null , this will return null, without through a exception