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.
Cracking the ‘Business Process Outsourcing’ Code Main.pptx
Better Strategies for Null Handling in Java
1. 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?
2
3. Problems with NPEs
RunTime Exception
–
Point of NPE easy to find
–
=> But not clear where the NULL value comes
from
3
4. Handling of NULL Values
Check after
Check before
String name = map.get(quot;Helloquot;);
if (map.containsKey(quot;Helloquot;)) {
if (name != null) {
String name = map.get(“hallo”);
...
} else { … }
} else { … }
Easy to forget
–
No support from type system
–
No tracking of NULL values
–
Can a reference be NULL ?
•
4
5. Null Handling in Groovy
def user = users[“hello”]
def streetname = user?.address?.street
Safe Navigation Operator ?.
user, address can be NULL
will simply return NULL instead of throwing an exception
5
6. Null types in Nice language
Nice language NULL types
- ?String name => possibly NULL
- String name => not NULL
String name = null;
=> Compiler error
6
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
7
8. Scala Option Class
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
map.get(quot;Helloquot;) match {
case Some(name) => // do something with name
case None => // do nothing
}
8
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
9
10. For Trick for Option with Iterable
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
public class Option<T> implements Iterable<T> { … }
for (String name: getName(“hello”)) {
// do something with name
}
10
11. Convenience methods
Option<String> name = none();
Option<String> name = option(dontKnow);
Option<String> name = some(„stephan“);
11
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) { … }
12
13. Easy default values with orElse()
String name = map.get(„hello“).orElse(„stephan“);
Easy handling of default values
Very little code compared to Check Before or
Check After for default handling in Java
13