Hoje em dia, as desvantagens de usar null como tipos de retorno ou passá-los como um argumento tornaram-se óbvias para a maioria dos desenvolvedores.
Desenvolvedores mais jovens, mesmo que não entendam, geralmente seguem o "código limpo" (depois de ler um livro de Robert Martin). Portanto, códigos com a possibilidade de ocorrência de NPE se tornaram menos comuns, embora, é claro, eles sejam.
Não quero dizer que qualquer uso de null é ruim, mas sim, você pode dizer "medir sete vezes, cortar uma vez".
No entanto, não reclamei sobre o NPE por muito tempo, mesmo quando os desenvolvedores de linguagens com controle estrito sobre este tópico se gabaram de sua segurança nula. Mas devido a um bug, percebi que apenas usar null não é tão ruim, mesmo se você retornar ou aprovar. Claro, isso é muito ruim, mas há coisas piores - nulo nas especificações.
Não seria particularmente interessante se a história fosse sobre uma empresa que fez uma especificação ruim. Em vez disso, vamos falar sobre a especificação mais conhecida do Java EE - Java Servlet Specification , especificamente pegar a classe HttpServletRequest e examinar o métodogetCookies()
getCookies
Cookie[] getCookies()
Retorna uma matriz contendo todos os Cookie
objetos que o cliente enviou com esta solicitação. Este método retorna null
se nenhum cookie foi enviado.
Retorna:
an array of all the
Cookies
included with this request, ornull
if the request has no cookies
:
This method returns
null
if no cookies were sent.
, , null. :
, , -, , .
null
, , . ? , ?
null vs empty array
null
, , :
API, null-check
- , getCookies() null .
. ,
null
( )
, , . null , , ( ).
, .
-, , . , , , .
-, (, - )
, null
for (Cookie cookie : httpServletRequest.getCookies()) {
// NPE! // …
}
int cookiesSize = httpServletRequest.getCookies().length // NPE!
null-check:
if (httpServletRequest.getCookies() != null)
for (Cookie cookie : httpServletRequest.getCookies()) {
// …
}
Cookie[] cookies = httpServletRequest.getCookies();
int cookiesSize = cookies == null ? 0 : cookies.length
, , NPE . , .
API, . Jetty
, , .
:
return cookies == null?null:cookies.getCookies();
:
if (cookies == null || cookies.getCookies().length == 0)
return null;
return _cookies.getCookies();
, .
, , . null
, , null
. , .
!
The GNU Classpath Extensions project, aka classpathx builds free versions of Oracle's Java extension libraries, the packages in the
javax
namespace. It is a companion project of the GNU Classpath project.
Cookie[] getCookies()
Gets all the Cookies present in the request.
Returns:
an array containing all the Cookies or an empty array if there are no cookies
Since:
2.0
. null
. , Sonar, SEI CERT Oracle Coding Standart for Java
. , , , .
.
- , null . , , , , . , .
, , , . null , .
- ( ):
- ,
. - , , .
, , .
Speaking at a software conference in 2009, Tony Hoare apologized for inventing the null reference:[25]
Eu chamo isso de meu erro de um bilhão de dólares. Foi a invenção da referência nula em 1965. Naquela época, eu estava projetando o primeiro sistema de tipo abrangente para referências em uma linguagem orientada a objetos ( ALGOL W ). Meu objetivo era garantir que todo uso de referências fosse absolutamente seguro, com checagem realizada automaticamente pelo compilador. Mas não pude resistir à tentação de colocar uma referência nula, simplesmente porque era muito fácil de implementar. Isso levou a inúmeros erros, vulnerabilidades e falhas no sistema, que provavelmente causaram um bilhão de dólares em dores e danos nos últimos quarenta anos