code: @Override
    public void deleteBuckets(List<String> bucketNames) throws IOException {
      logger.atFine().log("deleteBuckets(%s)", bucketNames);
  
      // Validate all the inputs first.
      for (String bucketName : bucketNames) {
        Preconditions.checkArgument(
            !Strings.isNullOrEmpty(bucketName), "bucketName must not be null or empty");
      }
  
      // Gather exceptions to wrap in a composite exception at the end.
      final List<IOException> innerExceptions = new ArrayList<>();
  
      for (final String bucketName : bucketNames) {
        final Storage.Buckets.Delete deleteBucket =
            configureRequest(gcs.buckets().delete(bucketName), bucketName);
  
        try {
          ResilientOperation.retry(
              ResilientOperation.getGoogleRequestCallable(deleteBucket),
              backOffFactory.newBackOff(),
              rateLimitedRetryDeterminer,
              IOException.class,
              sleeper);
        } catch (IOException e) {
          if (errorExtractor.itemNotFound(e)) {
            FileNotFoundException fnfe =
                GoogleCloudStorageExceptions.getFileNotFoundException(bucketName, null);
            innerExceptions.add((FileNotFoundException) fnfe.initCause(e));
          } else {
            innerExceptions.add(new IOException("Error deleting " + bucketName, e));
          }
        } catch (InterruptedException e) {
          throw new IOException(e);  // From sleep
        }
      }
      if (innerExceptions.size() > 0) {
        throw GoogleCloudStorageExceptions.createCompositeException(innerExceptions);
      }
    }
docs: See {@link GoogleCloudStorage#deleteBuckets(List)} for details about expected behavior.