Skip to content

NullAway complaining about returning null for a return type of CompletableFuture<Void> #801

@thugsatbay

Description

@thugsatbay
// The purpose of this method is to run some heavy code of publish data on a separate thread pool 
// as that is blocking code. Whereas once published switch back to application thread pool. 
// The response needs to be a CompletableFuture<Void>  that informs if publish has successfully
// happened.
  @SuppressWarnings("NullAway")
  public CompletableFuture<Void> produceAsync(
      @Nonnull Parameter1, @Nonnull Parameter2) {

    return CompletableFuture.supplyAsync(
            () -> {
              // Some method that will publish data, also might throw an error as RuntimeException
              return null; 
            },
            someExecutorService)
        // If an exception occurs or not we move the flow to application thread pool.
        .handleAsync(
            (ignored, throwable) -> {
              if (throwable != null) {
                if (throwable instanceof RuntimeException) {
                  throw (RuntimeException) throwable;
                }

                throw new RuntimeException(throwable);
              }
              // In case there was no exception return null.
              // NullAway is complaining we are returning null. Hence using suppress warning annotation.
              // The null is converted to CompletableFuture<Object> and then to CompletbaleFuture<Void>.
              return null; 
            },
            applicationExecutorService)
        // Convert to Void completable future. whenCompleteAsync returns Object completable future.
        .thenRun(() -> {});
  }
}

Linter complaining about null when contract of method is @nonnull. However, the null is converted from CompletableFuture -> CompletableFuture

We might need to fix the edge case for the linter. In general I think, NullAway for the special case of T is unable to handle it.

Metadata

Metadata

Assignees

No one assigned

    Labels

    jspecifyRelated to support for jspecify standard (see jspecify.dev)

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions