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();
  }
public static String lenientFormat(@NullableDecl String template, @NullableDecl Object... args) {
    template = String.valueOf(template); 

    if (args == null) {
      args = new Object[] {"(Object[])null"};
    } else {
      for (int i = 0; i < args.length; i++) {
        args[i] = lenientToString(args[i]);
      }
    }

    
    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 (i < args.length) {
      builder.append(" [");
      builder.append(args[i++]);
      while (i < args.length) {
        builder.append(", ");
        builder.append(args[i++]);
      }
      builder.append(']');
    }

    return builder.toString();
  }
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 ( ) ; }
TODO(diamondm) consider using Arrays.toString() for array parameters
TODO ( diamondm ) consider using Arrays . toString () for array parameters