SlideShare a Scribd company logo
Better Strategies for Null Handling in Java
Stephan Schmidt
Team manager PMI-3




Berlin, 05.08.2008
Most problematic errors in Java


      2 runtime problems in Java
       ClassCastException
         „Solved“ with Generics
       NullPointerException (NPE)
         Solution?



2
Problems with NPEs



        RunTime Exception
    –

        Point of NPE easy to find
    –

        => But not clear where the NULL value comes
          from




3
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
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
Null types in Nice language



    Nice language NULL types

    - ?String name => possibly NULL
    - String name => not NULL

    String name = null;
    => Compiler error

6
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
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
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
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
Convenience methods



     Option<String> name = none();


     Option<String> name = option(dontKnow);


     Option<String> name = some(„stephan“);




11
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
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
Questions?



www.ImmobilienScout24.de

More Related Content

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