webdevqa.jp.net

NullReferenceExceptionとは何ですか、どうすれば修正できますか?

私はいくつかのコードを持っていて、それが実行されると、NullReferenceExceptionを投げます。

オブジェクト参照がオブジェクトインスタンスに設定されていません。

これはどういう意味ですか、このエラーを修正するために何ができますか?

1877
John Saunders

もう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が発生します。

223
Simon Mourier

問題の変数が何も指していないことを意味します。私はこのように生成することができます:

SqlConnection connection = null;
connection.Open();

変数 "connection"を宣言している間は何も指していないため、エラーになります。メンバ "Open"を呼び出そうとすると、解決するための参照がなく、エラーが発生します。

このエラーを回避するには

  1. あなたがそれらで何かをしようとする前にあなたのオブジェクトを常に初期化しなさい。
  2. オブジェクトがnullかどうかわからない場合は、object == nullで確認してください。

JetBrainsのResharperツールは、null参照エラーの可能性があるコード内のすべての場所を識別するため、nullチェックを入れることができます。このエラーがバグの最大の原因、私見です。

154

それはあなたのコードが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
}
150
Jonathan Wood

シナリオに関係なく、原因は.NETでも常に同じであることに注意してください。

値がNothing/nullである参照変数を使用しようとしています。参照変数の値がNothing/nullの場合、それは実際にはヒープ上に存在するオブジェクトのインスタンスへの参照を保持していないことを意味します。

変数に何かを割り当てたり、変数に割り当てられた値のインスタンスを作成したりしないか、手動で変数をNothing/nullに設定するか、変数をNothing/nullに設定する関数を呼び出しました。

94
code master

スローされるこの例外の例は次のとおりです。あなたが何かをチェックしようとしているとき、それは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パラメータにあります。

85
Alex KeySmith

参照型を初期化しておらず、そのプロパティの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')を指すことができません。値型は常に値を含みますが。

参照型(これらはチェックする必要があります):

  • 動的
  • ひも

値の型(これらは無視してもかまいません):

  • 数値型
  • 整数型
  • 浮動小数点型
  • 小数
  • ブール
  • ユーザー定義構造体
81
Fabian Bigler

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

ここで、BookCarは互換性のない型です。 CarBookに変換/キャストすることはできません。このキャストが失敗すると、asnullを返します。この後にmybookを使用するとNullReferenceExceptionが発生します。

一般に、次のようにキャストまたはasを使用する必要があります。

型変換が常に成功することを期待している場合(つまり、オブジェクトが前もってあるべきことがわかっている場合)、キャストを使用する必要があります。

ComicBook cb = (ComicBook)specificBook;

型がわからないが、それを特定の型として使用するためにtryを使用したい場合は、asを使用します。

ComicBook cb = specificBook as ComicBook;
if (cb != null) {
   // ...
}
75

whatNullReferenceExceptions を引き起こし、avoid/fixに近づく一方で、このような例外は他で対処されています回答、多くのプログラマーがまだ学んでいないことは、開発中にそのような例外を独立してdebugする方法です。

Visual Studioでは、通常、これは Visual Studio Debugger のおかげで簡単です。


最初に、正しいエラーがキャッチされることを確認します-参照してください VS2010で 'System.NullReferenceException'でブレークを許可するにはどうすればよいですか?1

次に、 Starting with Debugging(F5) または Attach [the VS Debugger] to Running ProcessDebugger.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)例外を無視します

63
user2864740

Null値参照を含むオブジェクトを使用しています。だから、それはnull例外を与えています。この例では、文字列値はnullであり、その長さを確認すると例外が発生しました。

例:

string value = null;
if (value.Length == 0) // <-- Causes exception
{
    Console.WriteLine(value); // <-- Never reached
}

例外エラーは次のとおりです。

未処理の例外:

System.NullReferenceException:オブジェクト参照がオブジェクトのインスタンスに設定されていません。 Program.Main()で

63
user1814380

Simon Mourierがこの例を挙げました

object o = null;
DateTime d = (DateTime)o;  // NullReferenceException

nboxing変換(キャスト)fromobject(またはクラスSystem.ValueTypeのいずれかから) System.Enum、またはインターフェイス型から)to値型(Nullable<>以外)自体がNullReferenceExceptionを提供します。

他の方向では、boxing変換fromHasValuefalseに等しい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<>インスタンスをボックス化するときにランタイムが使用する特別なルールが原因で発生します。

57

エンティティフレームワークで使用されるエンティティのクラス名が、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を見てください

40
AbhinavRanjan

この例外を受け取る可能性があるもう1つの一般的なケースは、ユニットテスト中にクラスをモックすることです。使用されているモックフレームワークに関係なく、クラス階層のすべての適切なレベルが正しくモックされていることを確認する必要があります。特に、テスト対象のコードで参照されているHttpContextのすべてのプロパティはモックする必要があります。

やや冗長な例については、「 カスタムAuthorizationAttributeをテストするときにスローされる/ NullReferenceException 」を参照してください。

39
John Saunders

私はこれに答えるために別の見方をしています。この種の答えは "それを避けるために他に何ができるか? "

たとえば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();
    }
}
38
Mukus

「それについてどうすればよいか」については、多くの答えがあります。

このようなエラー状態を防ぐためのより「正式な」方法開発中は、契約による設計コード内。これは、クラス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プログラミング言語の設計に関連して

37

NullオブジェクトのPropertiesにアクセスしようとしているとき、または文字列値が空になり、文字列メソッドにアクセスしようとしているときにNullReferenceExceptionがスローされます。

例えば:

  1. 空文字列の文字列メソッドにアクセスした場合

    string str = string.Empty;
    str.ToLower(); // throw null reference exception
    
  2. Nullオブジェクトのプロパティがアクセスした場合

    Public Class Person {
        public string Name { get; set; }
    }
    Person objPerson;
    objPerson.Name  /// throw Null refernce Exception 
    
34
Hemant Bavle

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がアンパサンドと角かっこを誤解していたためだと感じました。

30
Travis Heeter

あなたはそれについて何ができますか?

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;

countryCountryというプロパティを持つState型のオブジェクトであるとします。 countryStateCounty、またはCitynullである場合、address will benull. Therefore you only have to check whetheraddressisnull`です。

これは素晴らしい機能ですが、情報が少なくて済みます。 4のうちどれがnullであるかは明らかではありません。

NULL可能のような組み込み?

C#にはNullable<T>のNiceの省略形があります。そのようにint?のようにタイプの後に疑問符を置くことで何かをnullにすることができます。

C#に上記のNotNull<T>構造体のようなものがあり、同様の速記、おそらく感嘆符(!)があれば、public void WriteName(Person! person)のように書くことができます。

22
Luis Perez

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条件演算子

9
M.Hassan

エラー行 "オブジェクト参照がオブジェクトのインスタンスに設定されていません。"は、インスタンスオブジェクトをオブジェクト参照に割り当てていないにもかかわらず、そのオブジェクトのプロパティ/メソッドにアクセスしていることを示しています。

たとえば、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;  
     }
}
8
Jaimin Dave

興味深いことに、このページの答えはいずれもEdgeの2つのケースについて言及していません。それらを追加しても気にしないでください。

エッジケース1:辞書への同時アクセス

.NETの総称辞書はスレッドセーフではなく、2つの並行スレッドからキーにアクセスしようとすると 時に NullReference、さらには(より頻繁に)KeyNotFoundExceptionをスローすることがあります。この場合、例外は非常に誤解を招きやすいです。

Edge case#2:安全でないコード

NullReferenceExceptionunsafeコードによって投げられるなら、あなたはあなたのポインタ変数を調べて、そしてそれらがIntPtr.Zeroか何かのためにチェックするかもしれません。これは同じことですが( "null pointer exception")、安全でないコードでは、変数はvalue-types /配列などにキャストされることが多く、value-typeがどのようにこれをスローするのか疑問に思います。例外。

(さて、あなたがそれを必要としない限り安全でないコードを使用しないもう一つの理由は、)

8
jazzcat

使用しようとしているクラスのオブジェクトがインスタンス化されていない場合、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がスローされます。

3
Nick

簡単に言えば、

作成されていない、または現在メモリ内にないオブジェクトにアクセスしようとしています。

だからこれに取り組む方法:

  1. デバッグしてデバッガを中断させます...中断された変数に直接移動します。これで問題は簡単に解決できます。適切な場所で new キーワードを使用することです。

  2. オブジェクトが存在しないためにいくつかの database コマンドが原因で発生した場合は、nullチェックを行って処理するだけです。

    if (i == null) {
        // Handle this
    }
    
  3. 最も難しいのは、_ gc _がすでにオブジェクトを収集している場合です。これは通常、文字列を使用してオブジェクトを検索しようとしている場合です。オブジェクトの場合、GCがすでにクリーンアップしている可能性があります...これは見つけるのが難しく、かなり問題になるでしょう...これに取り組むためのより良い方法は、開発プロセス中に必要に応じてnullチェックを行うことです。これはあなたに多くの時間を節約するでしょう。

名前で見つけることによって、私はいくつかのフレームワークがあなたが文字列を使ってオブジェクトを見つけることを可能にし、コードがこのように見えるかもしれないことを意味します: FindObject( "ObjectName");

2
Akash Gutha

NullReferenceExeptionを修正する最も簡単な方法は文字通り2つの方法です。たとえば、スクリプトが添付されたGameObjectとrb(rigidbody)という名前の変数がある場合、ゲームを開始するとこの変数はnullで始まり​​ます。
これは、コンピュータがその変数にデータを格納していないためにNullReferenceExeptionを受け取る理由です。

例としてRigidBody変数を使用します。
データを簡単に追加する方法はいくつかあります。

  1. AddComponent> Physics> Rigidbodyを使用して、RigidBodyをオブジェクトに追加します。
    それからあなたのスクリプトに入り、rb = GetComponent<Rigidbody>();とタイプしてください。
    このコード行はあなたのStart()またはAwake()関数の下で最もうまく機能します。
  2. プログラムでコンポーネントを追加し、1行のコードで同時に変数を代入することができます。rb = AddComponent<RigidBody>();

その他の注意:オブジェクトにコンポーネントを追加したいが、コンポーネントを追加するのを忘れた場合は、クラス宣言の上に[RequireComponent(typeof(RigidBody))]と入力します(すべての用途の下のスペース)。
ゲームを楽しんで楽しんでください!

0
CausticLasagne

この例外がスローされる可能性がある一般的なシナリオを考慮すると、オブジェクトを先頭にしてプロパティにアクセスします。

例:

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
0
Hiran