code: public static String lenientFormat(@NullableDecl String template, @NullableDecl Object... args) {
      template = String.valueOf(template); // null -> "null"
  
      if (args == null) {
        args = new Object[] {"(Object[])null"};
      } else {
        for (int i = 0; i < args.length; i++) {
          args[i] = lenientToString(args[i]);
        }
      }
  
      // start substituting the arguments into the '%s' placeholders
      StringBuilder builder = new StringBuilder(template.length() + 16 * args.length);
      int templateStart = 0;
      int i = 0;
      while (i < args.length) {
        int placeholderStart = template.indexOf("%s", templateStart);
        if (placeholderStart == -1) {
          break;
        }
        builder.append(template, templateStart, placeholderStart);
        builder.append(args[i++]);
        templateStart = placeholderStart + 2;
      }
      builder.append(template, templateStart, template.length());
  
      // if we run out of placeholders, append the extra args in square braces
      if (i < args.length) {
        builder.append(" [");
        builder.append(args[i++]);
        while (i < args.length) {
          builder.append(", ");
          builder.append(args[i++]);
        }
        builder.append(']');
      }
  
      return builder.toString();
    }
docs: TODO(diamondm) consider using Arrays.toString() for array parameters