Tony Hoare, que criou a idéia de uma referência nula em primeiro lugar, chama de erro de um milhão de dólares .
O problema não é sobre referências nulas em si, mas sobre a falta de verificação de tipo adequada na maioria dos idiomas seguros (de outro modo).
Essa falta de suporte, no idioma, significa que os bugs "null-bugs" podem estar ocultos no programa por um longo tempo antes de serem detectados. Essa é a natureza dos bugs, é claro, mas os "bugs nulos" agora são conhecidos por serem evitáveis.
Esse problema está especialmente presente em C ou C ++ (por exemplo) devido ao erro "rígido" que ele causa (uma falha do programa, imediata, sem recuperação elegante).
Em outros idiomas, sempre há a questão de como lidar com eles.
Em Java ou C #, você obteria uma exceção se tentar invocar um método em uma referência nula, e isso pode ser bom. E, portanto, a maioria dos programadores de Java ou C # está acostumada a isso e não entende por que alguém gostaria de fazer o contrário (e rindo do C ++).
No Haskell, você deve fornecer explicitamente uma ação para o caso nulo e, portanto, os programadores do Haskell se gabam de seus colegas, porque eles acertaram (certo?).
É, na verdade, o antigo debate sobre código de erro / exceção, mas desta vez com um valor do Sentinel em vez de código de erro.
Como sempre, o que for mais apropriado realmente depende da situação e da semântica que você está procurando.