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.
Falcon Invoice Discounting: The best investment platform in india for investors
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