blob: b2d3c26d94b1b9dac8b9a765bcc90888eea8c5d4 [file] [log] [blame] [view] [edit]
A null check (e.g., `x == null` or `x != null`) is redundant if it is performed
on an expression that is statically determined to be non-null according to
language semantics or nullness annotations. This check can optionally be
configured to flag redundant calls to `Objects.requireNonNull(x)` as well.
Within a `@NullMarked` scope, types are non-null by default unless explicitly
annotated with `@Nullable`. Therefore, checking a variable or method return
value (that isn't `@Nullable`) for nullness is unnecessary, as it should never
be null.
Example:
```java
import org.jspecify.annotations.NullMarked;
import org.jspecify.annotations.Nullable;
@NullMarked
class MyClass {
void process(String definitelyNonNull) {
// BUG: Diagnostic contains: RedundantNullCheck
if (definitelyNonNull == null) {
System.out.println("This will never happen");
}
// ...
}
String getString() {
return "hello";
}
@Nullable String getNullableString() {
return null;
}
void anotherMethod() {
String s = getString();
// BUG: Diagnostic contains: RedundantNullCheck
if (s == null) {
// s is known to be non-null because getString() is not @Nullable
// and we are in a @NullMarked scope.
System.out.println("Redundant check");
}
String nullableStr = getNullableString();
if (nullableStr == null) { // This check is NOT redundant
System.out.println("Nullable string might be null");
}
}
}
```
This check helps to clean up code and reduce clutter by removing unnecessary
null checks, making the code easier to read and maintain. It also reinforces the
contract provided by `@NullMarked` and `@Nullable` annotations.
## Configuration
By default, this check only flags redundant null checks using `== null` and `!=
null`. To also flag redundant calls to `Objects.requireNonNull(x)`, enable it
with the following flag:
```
-XepOpt:RedundantNullCheck:CheckRequireNonNull=true
```
## Suppression
Suppress false positives by adding the suppression annotation
`@SuppressWarnings("RedundantNullCheck")` to the enclosing element.