C# NullReferenceException

Resumo : neste tutorial, você aprenderá sobre C# NullReferenceException, entenderá as causas e como evitá-las.

A NullReferenceExceptioné um erro de tempo de execução que ocorre quando você tenta acessar um membro de um objeto que é null.

Compreendendo nulo

Quando você declara uma variável de um tipo de referência, o C# armazena os dados reais no heap e a referência que se refere aos dados reais na pilha . Por exemplo:

using static System.Console;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public override string ToString() => Name;
}

public class Program
{
    public static void Main(string[] args)
    {
        var person = new Person { Name = "John Doe", Age = 25 };
        WriteLine(person);
    }
}Linguagem de código:  C#  ( cs )

Neste exemplo, definimos uma Personclasse com duas propriedades Namee Agee criamos um novo Personobjeto. A personvariável é uma instância do Persontipo de referência.

Nos bastidores, C# armazena a personvariável na pilha e o objeto real na pilha, conforme ilustrado na imagem a seguir:

C# NullReferenceException

Quando você declara uma variável com o Persontipo, mas não a inicializa, a personreferência não se refere a nada, o que também é conhecido como null:

Person person; // nullLinguagem de código:  C#  ( cs )

Exceção C# NullReferenceException

Este NullReferenceExceptioné um erro de tempo de execução que ocorre quando você atribui nulluma variável e tenta acessar suas propriedades e métodos.

O exemplo a seguir mostra como declarar uma variável, atribuir nulo a ela e tentar acessar sua propriedade:

using static System.Console;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public override string ToString() => Name;
}

public class Program
{
    public static void Main(string[] args)
    {
        Person person = null;
        WriteLine(person.Name); 
    }
}Linguagem de código:  C#  ( cs )

O programa causa uma NullReferenceExceptionexceção porque a variável person é null.

Para evitá-lo, você precisa inicializar o personobjeto corretamente antes de acessar sua propriedade. Por exemplo:

Person person = new Person { Name="John Doe", Age=25 };
WriteLine(person.Name);Linguagem de código:  C#  ( cs )

Este exemplo é trivial e pode ser facilmente evitado na prática.

Normalmente, uma NullReferenceException ocorre quando você atribui o resultado de um método, que pode retornar um Personobjeto ou null, a uma variável.

Se o método retornar nulle você tentar acessar a propriedade do Personobjeto, você encontrará um arquivo NullReferenceException. Por exemplo:

using static System.Console;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set;}
    public override string ToString() => Name;
}

public class Program
{
    static Person CreatePerson(string name, int age)
    {
        if (age <= 0 || string.IsNullOrEmpty(name))
        {
            return null;
        }
        return new Person { Name = name, Age = age };
    }

    public static void Main(string[] args)
    {
        var person = CreatePerson("Jane", 0);
        WriteLine(person.Name);
    }
}Linguagem de código:  C#  ( cs )

Neste exemplo, o createPerson()método retorna nullse the agefor menor ou igual a zero ou se the nameestiver vazio.

No Main()método da Programclasse, declaramos uma personvariável e a inicializamos com o valor de retorno do CreatePerson()método.

Como the ageé zero, o CreatePerson()método retorna null. Acessar a Namepropriedade do personobjeto causará um arquivo NullReferenceException.

Para evitar isso, você pode verificar se personé nulo ou não antes de acessar suas propriedades e métodos como este:

var person = CreatePerson("Jane", 0);
if (person != null)
{
    WriteLine(person.Name);
}Linguagem de código:  C#  ( cs )

Para torná-lo mais curto, você pode usar o operador condicional nulo ?. que retorna imediatamente nullse a expressão no lado esquerdo for avaliada como null. Por exemplo:

var person = CreatePerson("Jane", 0);
WriteLine(person?.Name);Linguagem de código:  C#  ( cs )

Ao usar o operador condicional nulo, você não precisa usar a ifinstrução, resultando em um código mais conciso.

O Personobjeto possui a propriedade Namecom um tipo de referência de string . Se você não inicializar a Namepropriedade e tentar acessar seu método como ToUpper(), você também receberá um NullReferenceException. Por exemplo:

using static System.Console;

public class Person
{
    public string Name {  get; set; }
    public int Age { get; set;}
    public override string ToString() => Name;
}

public class Program
{
    public static void Main(string[] args)
    {
        var person = new Person { Age = 25 };
        WriteLine(person.Name.ToUpper()); // NullReferenceException
    }
}Linguagem de código:  C#  ( cs )

Para evitar isso, você pode usar o operador condicional nulo ( ?.). Por exemplo:

using static System.Console;

public class Person
{
    public string Name { get; set; }
    public int Age { get; set; }
    public override string ToString() => Name;
}

public class Program
{
    public static void Main(string[] args)
    {
        var person = new Person { Age = 25 };
        WriteLine(person?.Name?.ToUpper()); 
    }
}Linguagem de código:  C#  ( cs )

Resumo

  • A NullReferenceExceptionocorre quando você tenta acessar um membro de um objeto que é null.
  • Sempre verifique se um objeto não é nulo antes de acessar suas propriedades e métodos usando uma ifinstrução ou operador condicional nulo ( ?.)

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *