code: public <R> void batchCallback(List<? extends Row> actions,
        Object[] results, Batch.Callback<R> callback) throws IOException, InterruptedException {
      Preconditions.checkArgument(results.length == actions.size(),
          "Result array must have same dimensions as actions list.");
      Timer.Context timerContext = batchTimer.time();
      List<ApiFuture<?>> resultFutures = issueAsyncRowRequests(actions, results, callback);
      // Don't want to throw an exception for failed futures, instead the place in results is
      // set to null.
      List<Throwable> problems = new ArrayList<>();
      List<Row> problemActions = new ArrayList<>();
      List<String> hosts = new ArrayList<>();
      for (int i = 0; i < resultFutures.size(); i++){
        try {
          resultFutures.get(i).get();
        } catch (ExecutionException e) {
          problemActions.add(actions.get(i));
          problems.add(e.getCause());
          hosts.add(options.getDataHost());
        }
      }
      if (problems.size() > 0) {
        throw new RetriesExhaustedWithDetailsException(problems, problemActions, hosts);
      }
      timerContext.close();
    }
docs: Implementation of
  {@link org.apache.hadoop.hbase.client.HTable#batchCallback(List, Object[], Batch.Callback)}
  
  @param actions a {@link java.util.List} object.
  @param results an array of {@link java.lang.Object} objects.
  @param callback a {@link org.apache.hadoop.hbase.client.coprocessor.Batch.Callback} object.
  @throws java.io.IOException if any.
  @throws java.lang.InterruptedException if any.
  @param <R> a R object.