A Informática - ciência da informação - consiste em criar, ler, modificar ou atualizar dados.
Para isso, as linguagens de programação fornecem todas as ferramentas necessárias para representar esses dados na memória, e manipulá-los. Mas há um caso particular, a representação da ausência de dados.
Em um questionário, você pode responder: "Sim", "Não" ou "Não sei".
A resposta "Não sei" é ambígua. Isto pode significar:
Você ainda não sabe, mas saberá quando for realmente necessário.
Você deveria saber mas, mesmo precisando, não sabe.
Você nunca soube, nunca saberá e, o fato de não sabê-lo, é uma resposta válida
Na maioria das linguagens, esses três casos são modelados da mesma forma, com o valor especial NULL. No entanto, é importante distinguir estes casos para evitar erros, porque é impossível processar um número que não existe!
Observação: Dependendo da linguagem, o valor NULL pode se chamar ou se escrever de forma diferente (null, nenhum, zero, etc), isso não altera o papel desse valor no programa.
Na inicialização do programa, os dados ainda não existem, logo, algumas variáveis descritas no código-fonte já estão disponíveis. Mas, então, quais serão seus valores?
Muitas linguagens (não todas) dão um valor padrão para essas variáveis, geralmente 0 para os tipos numéricos e NULL para os outros. Isso garante um certo determinismo na execução do programa, caso usássemos uma variável sem inicializá-la.
Cuidado com os valores padrão, porque em si eles não representam nenhum dado específico ao programa e utilizá-los como um dado válido pode levar a erros frequentes.
NullPointerException em Java, NullReferenceException en C#, etc.
Cada linguagem tem sua própria maneira de nomear o erro e, portanto, o problema é sempre o mesmo: tentamos manipular um dado que não existe. Isto significa que a variável tem valor NULL e, consequentemente, é impossível tratá-la como um dado normal. Em geral, trata-se de um erro no código do programa porque esquecemos de tratar o caso especial onde o dado a ser manipulado não existe...
Para corrigir esses erros, devemos tentar entender de onde vem o valor NULL, ou seja, descobrir por que a variável usada não tem o dado que queríamos processar e adaptar o seu código para levar em conta este caso especial.
Muitas vezes, usa-se o valor NULL para indicar, explicitamente, que um dado facultativo está ausente.
Por exemplo, nos bancos de dados, o valor NULL tem esse papel de dado ausente, assim, ele é manipulado de forma diferente em relação aos outros, incluindo o uso do teste
IS NULL
, já que a comparação
=NULL
não vai funcionar nunca, porque não se pode comparar um dado com uma ausência de dado...
Ter o NULL como valor é a principal armadilha dos desenvolvedores, porque se o NULL é propagado no código, ele pode tornar-se rapidamente uma fonte de erro. Na verdade, é fácil dar um jeito para que todas as variáveis sejam inicializadas. Em compensação, é mais difícil lembrar do critério facultativo do dado e, consequentemente, esquecer de tratar o caso em que ele está ausente.
Observação: no JavaScript,
undefined
é o valor padrão que marca a ausência do dado. Ele se distingue do valor
null
que marca, explicitamente, a ausência do dado. Estes dois valores podem provocar os mesmos erros se utilizados no lugar de um dado válido.
Para evitar os erros com valores NULL seria melhor usar um valor específico para marcar a ausência do dado que poderíamos usar como qualquer outro dado.
Por exemplo, para os números flutuantes, existe o valor especial NaN ("Não é um número"), que atribui um valor para o resultado de um cálculo matemático impossível (ex: a raiz quadrada de um número negativo).
Por isso, é interessante introduzir em seus programas, um ou mais valores, para cada tipo de ausência de dados a ser representado, construir suas funções em torno desses valores e transformar, rapidamente, todos os valores NULL em um desses valores.