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 Person
classe com duas propriedades Name
e Age
e criamos um novo Person
objeto. A person
variável é uma instância do Person
tipo de referência.
Nos bastidores, C# armazena a person
variável na pilha e o objeto real na pilha, conforme ilustrado na imagem a seguir:
Quando você declara uma variável com o Person
tipo, mas não a inicializa, a person
referência não se refere a nada, o que também é conhecido como null
:
Person person; // null
Linguagem de código: C# ( cs )
Exceção C# NullReferenceException
Este NullReferenceException
é um erro de tempo de execução que ocorre quando você atribui null
uma 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 NullReferenceException
exceção porque a variável person é null
.
Para evitá-lo, você precisa inicializar o person
objeto 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 Person
objeto ou null
, a uma variável.
Se o método retornar null
e você tentar acessar a propriedade do Person
objeto, 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 null
se the age
for menor ou igual a zero ou se the name
estiver vazio.
No Main()
método da Program
classe, declaramos uma person
variá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 Name
propriedade do person
objeto 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 null
se 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 if
instrução, resultando em um código mais conciso.
O Person
objeto possui a propriedade Name
com um tipo de referência de string . Se você não inicializar a Name
propriedade 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
NullReferenceException
ocorre 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
if
instrução ou operador condicional nulo (?.
)