Ler em inglês

Compartilhar via


NullReferenceException Classe

Definição

A exceção que é gerada quando ocorre uma tentativa de desreferenciar um objeto de referência nula.

C#
public class NullReferenceException : Exception
C#
public class NullReferenceException : SystemException
C#
[System.Serializable]
public class NullReferenceException : SystemException
C#
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class NullReferenceException : SystemException
Herança
NullReferenceException
Herança
NullReferenceException
Atributos

Comentários

Uma NullReferenceException exceção é gerada quando você tenta acessar um membro em um tipo cujo valor é null. Uma NullReferenceException exceção normalmente reflete o erro do desenvolvedor e é gerada nos seguintes cenários:

  • Você esqueceu de instanciar um tipo de referência. No exemplo a seguir, é declarado, names mas nunca instanciado:

    C#
    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main(string[] args)
       {
          int value = Int32.Parse(args[0]);
          List<String> names;
          if (value > 0)
             names = new List<String>();
    
          names.Add("Major Major Major");
       }
    }
    // Compilation displays a warning like the following:
    //    Example1.cs(10) : warning BC42104: Variable //names// is used before it
    //    has been assigned a value. A null reference exception could result
    //    at runtime.
    //
    //          names.Add("Major Major Major")
    //          ~~~~~
    // The example displays output like the following output:
    //    Unhandled Exception: System.NullReferenceException: Object reference
    //    not set to an instance of an object.
    //       at Example.Main()
    

    Alguns compiladores emitem um aviso quando compilam esse código. Outros emitem um erro e a compilação falha. Para resolver esse problema, instancie o objeto para que seu valor não seja mais null. O exemplo a seguir faz isso chamando o construtor de classe de um tipo.

    C#
    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = new List<String>();
          names.Add("Major Major Major");
       }
    }
    
  • Você esqueceu de dimensionar uma matriz antes de inicializá-la. No exemplo a seguir, values é declarado como uma matriz de inteiros, mas o número de elementos que ele contém nunca é especificado. A tentativa de inicializar seus valores, portanto, lançou uma NullReferenceException exceção.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
           int[] values = null;
           for (int ctr = 0; ctr <= 9; ctr++)
              values[ctr] = ctr * 2;
    
           foreach (var value in values)
              Console.WriteLine(value);
       }
    }
    // The example displays the following output:
    //    Unhandled Exception:
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    Você pode eliminar a exceção declarando o número de elementos na matriz antes de inicializá-la, como faz o exemplo a seguir.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
           int[] values = new int[10];
           for (int ctr = 0; ctr <= 9; ctr++)
              values[ctr] = ctr * 2;
    
           foreach (var value in values)
              Console.WriteLine(value);
       }
    }
    // The example displays the following output:
    //    0
    //    2
    //    4
    //    6
    //    8
    //    10
    //    12
    //    14
    //    16
    //    18
    

    Para obter mais informações sobre como declarar e inicializar matrizes, consulte Matrizes e matrizes.

  • Você obtém um valor retornado nulo de um método e, em seguida, chama um método no tipo retornado. Às vezes, isso é o resultado de um erro de documentação; a documentação não observa que uma chamada de método pode retornar null. Em outros casos, seu código pressupõe erroneamente que o método sempre retornará um valor não nulo .

    O código no exemplo a seguir pressupõe que o método sempre retorna Person um Array.Find objeto cujo FirstName campo corresponde a uma cadeia de caracteres de pesquisa. Como não há correspondência, o runtime gera uma NullReferenceException exceção.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          Person[] persons = Person.AddRange( new String[] { "Abigail", "Abra",
                                              "Abraham", "Adrian", "Ariella",
                                              "Arnold", "Aston", "Astor" } );
          String nameToFind = "Robert";
          Person found = Array.Find(persons, p => p.FirstName == nameToFind);
          Console.WriteLine(found.FirstName);
       }
    }
    
    public class Person
    {
       public static Person[] AddRange(String[] firstNames)
       {
          Person[] p = new Person[firstNames.Length];
          for (int ctr = 0; ctr < firstNames.Length; ctr++)
             p[ctr] = new Person(firstNames[ctr]);
    
          return p;
       }
    
       public Person(String firstName)
       {
          this.FirstName = firstName;
       }
    
       public String FirstName;
    }
    // The example displays the following output:
    //       Unhandled Exception: System.NullReferenceException:
    //       Object reference not set to an instance of an object.
    //          at Example.Main()
    

    Para resolver esse problema, teste o valor retornado do método para garantir que ele não null seja antes de chamar nenhum de seus membros, como faz o exemplo a seguir.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          Person[] persons = Person.AddRange( new String[] { "Abigail", "Abra",
                                              "Abraham", "Adrian", "Ariella",
                                              "Arnold", "Aston", "Astor" } );
          String nameToFind = "Robert";
          Person found = Array.Find(persons, p => p.FirstName == nameToFind);
          if (found != null)
             Console.WriteLine(found.FirstName);
          else
             Console.WriteLine("{0} not found.", nameToFind);
       }
    }
    
    public class Person
    {
       public static Person[] AddRange(String[] firstNames)
       {
          Person[] p = new Person[firstNames.Length];
          for (int ctr = 0; ctr < firstNames.Length; ctr++)
             p[ctr] = new Person(firstNames[ctr]);
    
          return p;
       }
    
       public Person(String firstName)
       {
          this.FirstName = firstName;
       }
    
       public String FirstName;
    }
    // The example displays the following output:
    //        Robert not found
    
  • Você está usando uma expressão (por exemplo, você está encadeando uma lista de métodos ou propriedades juntos) para recuperar um valor e, embora esteja verificando se o valor é null, o runtime ainda gera uma NullReferenceException exceção. Isso ocorre porque um dos valores intermediários na expressão retorna null. Como resultado, seu teste para null nunca é avaliado.

    O exemplo a seguir define um Pages objeto que armazena em cache informações sobre páginas da Web, que são apresentadas por Page objetos . O Example.Main método verifica se a página da Web atual tem um título não nulo e, se tiver, exibe o título. No entanto, apesar dessa marcar, o método gera uma NullReferenceException exceção.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          var pages = new Pages();
          if (! String.IsNullOrEmpty(pages.CurrentPage.Title)) {
             String title = pages.CurrentPage.Title;
             Console.WriteLine("Current title: '{0}'", title);
          }
       }
    }
    
    public class Pages
    {
       Page[] page = new Page[10];
       int ctr = 0;
    
       public Page CurrentPage
       {
          get { return page[ctr]; }
          set {
             // Move all the page objects down to accommodate the new one.
             if (ctr > page.GetUpperBound(0)) {
                for (int ndx = 1; ndx <= page.GetUpperBound(0); ndx++)
                   page[ndx - 1] = page[ndx];
             }
             page[ctr] = value;
             if (ctr < page.GetUpperBound(0))
                ctr++;
          }
       }
    
       public Page PreviousPage
       {
          get {
             if (ctr == 0) {
                if (page[0] == null)
                   return null;
                else
                   return page[0];
             }
             else {
                ctr--;
                return page[ctr + 1];
             }
          }
       }
    }
    
    public class Page
    {
       public Uri URL;
       public String Title;
    }
    // The example displays the following output:
    //    Unhandled Exception:
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    A exceção é gerada porque pages.CurrentPage retorna null se nenhuma informação de página é armazenada no cache. Essa exceção pode ser corrigida testando o valor da propriedade antes de CurrentPage recuperar a propriedade do Title objeto atualPage, como faz o exemplo a seguir:

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          var pages = new Pages();
          Page current = pages.CurrentPage;
          if (current != null) {
             String title = current.Title;
             Console.WriteLine("Current title: '{0}'", title);
          }
          else {
             Console.WriteLine("There is no page information in the cache.");
          }
       }
    }
    // The example displays the following output:
    //       There is no page information in the cache.
    
  • Você está enumerando os elementos de uma matriz que contém tipos de referência e sua tentativa de processar um dos elementos gera uma NullReferenceException exceção.

    O exemplo a seguir define uma matriz de cadeia de caracteres. Uma for instrução enumera os elementos na matriz e chama o método de Trim cada cadeia de caracteres antes de exibir a cadeia de caracteres.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] values = { "one", null, "two" };
          for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}{1}", values[ctr].Trim(),
                           ctr == values.GetUpperBound(0) ? "" : ", ");
          Console.WriteLine();
       }
    }
    // The example displays the following output:
    //    Unhandled Exception:
    //       System.NullReferenceException: Object reference not set to an instance of an object.
    //       at Example.Main()
    

    Essa exceção ocorrerá se você pressupor que cada elemento da matriz deve conter um valor não nulo e o valor do elemento de matriz é, na verdade null, . A exceção pode ser eliminada testando se o elemento é null antes de executar qualquer operação nesse elemento, como mostra o exemplo a seguir.

    C#
    using System;
    
    public class Example
    {
       public static void Main()
       {
          String[] values = { "one", null, "two" };
          for (int ctr = 0; ctr <= values.GetUpperBound(0); ctr++)
             Console.Write("{0}{1}",
                           values[ctr] != null ? values[ctr].Trim() : "",
                           ctr == values.GetUpperBound(0) ? "" : ", ");
          Console.WriteLine();
       }
    }
    // The example displays the following output:
    //       one, , two
    
  • Uma NullReferenceException exceção pode ser gerada por um método quando acessa um membro de um de seus argumentos, mas esse argumento é null. O PopulateNames método no exemplo a seguir gera a exceção na linha names.Add(arrName);.

    C#
    using System;
    using System.Collections.Generic;
    
    public class Example
    {
       public static void Main()
       {
          List<String> names = GetData();
          PopulateNames(names);
       }
    
       private static void PopulateNames(List<String> names)
       {
          String[] arrNames = { "Dakota", "Samuel", "Nikita",
                                "Koani", "Saya", "Yiska", "Yumaevsky" };
          foreach (var arrName in arrNames)
             names.Add(arrName);
       }
    
       private static List<String> GetData()
       {
          return null;
       }
    }
    // The example displays output like the following:
    //    Unhandled Exception: System.NullReferenceException: Object reference
    //    not set to an instance of an object.
    //       at Example.PopulateNames(List`1 names)
    //       at Example.Main()
    

    Para resolver esse problema, verifique se o argumento passado para o método não nullé ou manipule a exceção gerada em um try…catch…finally bloco. Para obter mais informações, consulte Exceções.

As seguintes instruções de MSIL (Microsoft Intermediate Language) lançam : , , , cpobj, initblk, ldelem.<type>, ldelema, ldfldaldfld, ldind.<type>, ldlenstelem.<type>, stfld, stind.<type>, , throwe unbox. cpblkcallvirtNullReferenceException

NullReferenceException usa o COR_E_NULLREFERENCE HRESULT, que tem o valor 0x80004003.

Para obter uma lista de valores de propriedade inicial para uma instância do NullReferenceException, consulte o NullReferenceException construtores.

Manipulando NullReferenceException no código de versão

Geralmente, é melhor evitar um NullReferenceException do que tratá-lo depois que ele ocorre. Tratar uma exceção pode fazer com que seu código seja difícil de manter e entender e pode, algumas vezes, introduzir outros bugs. Uma NullReferenceException é frequentemente um erro não recuperável. Nesses casos, deixar a exceção interromper o aplicativo pode ser a melhor alternativa.

No entanto, há várias situações em que o tratamento do erro pode ser útil:

  • Seu aplicativo pode ignorar objetos nulos. Por exemplo, se seu aplicativo recupera e processa gravações em um banco de dados, você pode ser capaz de ignorar um certo número de gravações ruins que resultam em objetos nulos. Gravar os dados ruins em um arquivo de log ou na interface de usuário do aplicativo pode ser tudo que você precisa fazer.

  • Você pode recuperar a partir da exceção. Por exemplo, uma chamada para um serviço Web que retorna um tipo de referência pode retornar nulo se a conexão for perdida ou a conexão atingir o tempo limite. Você pode tentar restabelecer a conexão e tentar a chamada novamente.

  • Você pode restaurar o estado de seu aplicativo para um estado válido. Por exemplo, pode ser que você esteja realizando uma tarefa de várias etapas que requer que as informações sejam salvas em um armazenamento de dados antes de chamar um método que lança uma NullReferenceException. Se o objeto não inicializado corromper a gravação de dados, você poderá remover os dados anteriores antes de fechar o aplicativo.

  • Você deseja reportar a exceção. Por exemplo, se o erro foi causado por um erro do usuário do seu aplicativo, você pode gerar uma mensagem para ajudá-lo a fornecer as informações corretas. Você pode também registrar informações sobre o erro para ajudá-lo a solucionar o problema. Algumas estruturas, como o ASP.NET, tem um manipulador de exceção de alto nível que captura todos os erros para que o aplicativo nunca falhe; nesse caso, a exceção de registro em log pode ser a única maneira de saber que ele ocorre.

Construtores

NullReferenceException()

Inicializa uma nova instância da NullReferenceException classe , definindo a Message propriedade da nova instância como uma mensagem fornecida pelo sistema que descreve o erro, como "O valor 'null' foi encontrado onde uma instância de um objeto foi necessária." Essa mensagem leva em conta a cultura atual do sistema.

NullReferenceException(SerializationInfo, StreamingContext)
Obsoleto.

Inicializa uma nova instância da classe NullReferenceException com dados serializados.

NullReferenceException(String)

Inicializa uma nova instância da classe NullReferenceException com uma mensagem de erro especificada.

NullReferenceException(String, Exception)

Inicializa uma nova instância da classe NullReferenceException com uma mensagem de erro especificada e uma referência à exceção interna que é a causa da exceção.

Propriedades

Data

Obtém uma coleção de pares de chave/valor que fornecem informações definidas pelo usuário adicionais sobre a exceção.

(Herdado de Exception)
HelpLink

Obtém ou define um link para o arquivo de ajuda associado a essa exceção.

(Herdado de Exception)
HResult

Obtém ou define HRESULT, um valor numérico codificado que é atribuído a uma exceção específica.

(Herdado de Exception)
InnerException

Obtém a instância Exception que causou a exceção atual.

(Herdado de Exception)
Message

Obtém uma mensagem que descreve a exceção atual.

(Herdado de Exception)
Source

Obtém ou define o nome do aplicativo ou objeto que causa o erro.

(Herdado de Exception)
StackTrace

Obtém uma representação de cadeia de caracteres de quadros imediatos na pilha de chamadas.

(Herdado de Exception)
TargetSite

Obtém o método que gerou a exceção atual.

(Herdado de Exception)

Métodos

Equals(Object)

Determina se o objeto especificado é igual ao objeto atual.

(Herdado de Object)
GetBaseException()

Quando substituído em uma classe derivada, retorna a Exception que é a causa raiz de uma ou mais exceções subsequentes.

(Herdado de Exception)
GetHashCode()

Serve como a função de hash padrão.

(Herdado de Object)
GetObjectData(SerializationInfo, StreamingContext)
Obsoleto.

Quando substituído em uma classe derivada, define o SerializationInfo com informações sobre a exceção.

(Herdado de Exception)
GetType()

Obtém o tipo de runtime da instância atual.

(Herdado de Exception)
MemberwiseClone()

Cria uma cópia superficial do Object atual.

(Herdado de Object)
ToString()

Cria e retorna uma representação de cadeia de caracteres da exceção atual.

(Herdado de Exception)

Eventos

SerializeObjectState
Obsoleto.

Ocorre quando uma exceção é serializada para criar um objeto de estado de exceção que contém dados serializados sobre a exceção.

(Herdado de Exception)

Aplica-se a

Produto Versões
.NET Core 1.0, Core 1.1, Core 2.0, Core 2.1, Core 2.2, Core 3.0, Core 3.1, 5, 6, 7, 8, 9
.NET Framework 1.1, 2.0, 3.0, 3.5, 4.0, 4.5, 4.5.1, 4.5.2, 4.6, 4.6.1, 4.6.2, 4.7, 4.7.1, 4.7.2, 4.8, 4.8.1
.NET Standard 1.0, 1.1, 1.2, 1.3, 1.4, 1.5, 1.6, 2.0, 2.1
UWP 10.0

Confira também