better strategies for null handling in java
DESCRIPTION
Most developers handle null not defensive enough. The presentation is about strategies for better null handling in Java to make APIs clearer and prevent Null Pointer Exceptions.TRANSCRIPT
Better Strategies for Null Handling in Java
Stephan Schmidt
Team manager PMI-3
Berlin, 05.08.2008
2
Most problematic errors in Java
� 2 runtime problems in Java
ClassCastException
„Solved“ with Generics
NullPointerException (NPE)
Solution?
3
Problems with NPEs
– RunTime Exception
– Point of NPE easy to find
=> But not clear where the NULL value comes
from
4
Handling of NULL Values
– Easy to forget
– No support from type system
– No tracking of NULL values
• Can a reference be NULL ?
Check before
if (map.containsKey("Hello")) {
String name = map.get(“hallo”);
} else { … }
Check after
String name = map.get("Hello");
if (name != null) {
...
} else { … }
5
Null Handling in Groovy
�Safe Navigation Operator ?.
user, address can be NULL
will simply return NULL instead of throwing an exception
def user = users[“hello”]
def streetname = user?.address?.street
6
Null types in Nice language
Nice language NULL types
- ?String name => possibly NULL
- String name => not NULL
String name = null;
=> Compiler error
7
NULL Handling with Annotations
�@NotNull, @Nullable in Java
IDEA and others, JSR 308
Automatic checks for NULL
IDEA tells you when NPEs will occure
@NotNull
public String get(@NotNull String name) { … }
Everything not null and @Optional for NULL better solution
8
Scala Option Class
map.get("Hello") match {
case Some(name) => // do something with name
case None => // do nothing
}
Option can have a value or not (think container with 0 or 1 elements).
Subclasses are Some and None
Must deal with None (NULL) value, cannot ignore
Called Maybe (Just, Nothing) in Haskell
9
Option in Java
Option<String> option = map.get(„hello“);
if (option instanceof Some) {
String name = ((Some) option).value();
….
} else {
// option is none, there is no „hello“
}
�Explicit handling of „NULL“ value necessary
�Or:
�option.isSome() and option.value() without cast
10
For Trick for Option with Iterable
public class Option<T> implements Iterable<T> { … }
for (String name: getName(“hello”)) {
// do something with name
}
Sometimes the none case needs no handling
For and Iterable<T> can be used
For automatically unwraps Option, does nothing in None case
None returns EMPTY list, Some one element list with option value
11
Convenience methods
Option<String> name = none();
Option<String> name = option(dontKnow);
Option<String> name = some(„stephan“);
12
How does this method handle NULL values?
�API makes the intention clear
� public Option<String> getName() {…}
� public String getName() { …}
� public void setName(Option<String> name) { … }
� public void setName(String name) { … }
13
Easy default values with orElse()
�Easy handling of default values
�Very little code compared to Check Before or
Check After for default handling in Java
String name = map.get(„hello“).orElse(„stephan“);
www.ImmobilienScout24.de
Questions?