Heutzutage sind die Nachteile der Verwendung von Null als Rückgabetypen oder der Übergabe als Argument für die meisten Entwickler offensichtlich geworden.
Jüngere Entwickler folgen normalerweise "sauberem Code" (nachdem sie ein Buch von Robert Martin gelesen haben), auch wenn sie es nicht verstehen. Daher ist Code mit der Möglichkeit des Auftretens von NPE seltener geworden, obwohl dies natürlich der Fall ist.
Ich möchte nicht sagen, dass die Verwendung von Null schlecht ist, sondern Sie können sagen: "Sieben Mal messen, einmal schneiden".
Ich habe mich jedoch lange nicht mehr über NPE beschwert, selbst wenn Entwickler aus Sprachen mit strenger Kontrolle zu diesem Thema sich ihrer Nullsicherheit rühmten. Aber aufgrund eines Fehlers wurde mir klar, dass es nicht so schlimm ist, nur null zu verwenden, selbst wenn Sie es zurückgeben oder weitergeben. Das ist natürlich sehr schlecht, aber es gibt schlimmere Dinge - null in den Spezifikationen.
Es wäre nicht besonders interessant, wenn die Geschichte von einem Unternehmen handeln würde, das eine schlechte Spezifikation gemacht hat. Lassen Sie uns stattdessen über die bekanntere Spezifikation aus Java EE - Java Servlet Specification sprechen. Nehmen Sie insbesondere die HttpServletRequest- Klasse und untersuchen Sie die MethodegetCookies()
getCookies
Cookie[] getCookies()
Gibt ein Array zurück, das alle Cookie
Objekte enthält, die der Client mit dieser Anforderung gesendet hat. Diese Methode wird zurückgegeben, null
wenn keine Cookies gesendet wurden.
Kehrt zurück:
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]
Ich nenne es meinen Milliardenfehler. Es war die Erfindung der Nullreferenz im Jahr 1965. Zu dieser Zeit entwarf ich das erste umfassende Typsystem für Referenzen in einer objektorientierten Sprache ( ALGOL W ). Mein Ziel war es sicherzustellen, dass jede Verwendung von Referenzen absolut sicher ist, wobei die Überprüfung automatisch vom Compiler durchgeführt wird. Aber ich konnte der Versuchung nicht widerstehen, eine Nullreferenz einzugeben, einfach weil es so einfach zu implementieren war. Dies hat zu unzähligen Fehlern, Schwachstellen und Systemabstürzen geführt, die in den letzten vierzig Jahren wahrscheinlich eine Milliarde Dollar an Schmerzen und Schäden verursacht haben