Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to use @Nullable and @Nonnull annotations more effectively?

I can see that @Nullable and @Nonnull annotations could be helpful in preventing NullPointerExceptions but they do not propagate very far.

  • The effectiveness of these annotations drop off completely after one level of indirection, so if you only add a few they don't propagate very far.
  • Since these annotations are not well enforced there is a danger of assuming a value marked with @Nonnull is not null and consequently not performing null checks.

The code below causes a parameter marked with @Nonnull to be null without raising any complaints. It throws a NullPointerException when it is run.

public class Clazz {     public static void main(String[] args){         Clazz clazz = new Clazz();          // this line raises a complaint with the IDE (IntelliJ 11)         clazz.directPathToA(null);          // this line does not         clazz.indirectPathToA(null);      }      public void indirectPathToA(Integer y){         directPathToA(y);     }      public void directPathToA(@Nonnull Integer x){         x.toString(); // do stuff to x             } } 

Is there a way to make these annotations more strictly enforced and/or propagate further?

like image 522
Mike Rylander Avatar asked Nov 20 '12 23:11

Mike Rylander


People also ask

What is the use of @nullable annotation?

@Nullable The @Nullable annotation helps you detect: Method calls that can return null. Variables (fields, local variables, and parameters), that can be null.

What does @NonNull annotation do?

The @NonNull annotation is the most important among all the annotations of the null-safety feature. We can use this annotation t0 declare non-null constraint anywhere an object reference is expected: a field, a method parameter or a method's return value.

What is the use of @NonNull in Java?

@NonNull – The compiler can determine cases where a code path might receive a null value, without ever having to debug a NullPointerException. @ReadOnly – The compiler will flag any attempt to change the object. This is similar to Collections.

What does CheckForNull do?

Annotation Type CheckForNull The annotated element might be null, and uses of the element should check for null. When this annotation is applied to a method it applies to the method return value.


2 Answers

Short answer: I guess these annotations are only useful for your IDE to warn you of potentially null pointer errors.

As said in the "Clean Code" book, you should check your public method's parameters and also avoid checking invariants.

Another good tip is never returning null values, but using Null Object Pattern instead.

like image 101
Pedro Boechat Avatar answered Sep 24 '22 03:09

Pedro Boechat


Other than your IDE giving you hints when you pass null to methods that expect the argument to not be null, there are further advantages:

  • Static code analysis tools can test the same as your IDE (e.g. FindBugs)
  • You can use Aspect-oriented programming (AOP) to check these assertions

This can help your code be more maintainable (since you do not need null checks) and less error-prone.

like image 26
Uwe Plonus Avatar answered Sep 21 '22 03:09

Uwe Plonus