Better Strategies for Null Handling in Java

  • View
    16.744

  • Download
    0

  • Category

    Business

Preview:

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.

Citation preview

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?

Recommended