Program: 92297
Project: 92297
Buggy source:
/** 
 * Creates a new sub-command with the given command-line arguments. The   {@code arguments} array is the same array than the one given to the {@code main(String[])} method.The argument at index  {@code commandIndex} is the name of this command, and will be ignored except forthe special  {@value #TEST} value which is used only at JUnit testing time.
 * @param commandIndex Index of the {@code args} element containing the sub-command name.
 * @param arguments    The command-line arguments provided by the user.
 * @param validOptions The command-line options allowed by this sub-command.
 * @throws InvalidOptionException If an illegal option has been provided, or the option has an illegal value.
 */
protected SubCommand(final int commandIndex,final String[] arguments,final EnumSet<Option> validOptions) throws InvalidOptionException {
  boolean isTest=false;
  this.validOptions=validOptions;
  options=new EnumMap<Option,String>(Option.class);
  files=new ArrayList<String>(arguments.length);
  for (int i=0; i < arguments.length; i++) {
    final String arg=arguments[i];
    if (i == commandIndex) {
      isTest=arg.equals(TEST);
      continue;
    }
    if (arg.startsWith(Option.PREFIX)) {
      final String name=arg.substring(Option.PREFIX.length());
      final Option option;
      try {
        option=Option.valueOf(name.toUpperCase(Locale.US));
      }
 catch (      IllegalArgumentException e) {
        throw new InvalidOptionException(Errors.format(Errors.Keys.UnknownOption_1,name),e,name);
      }
      if (!validOptions.contains(option)) {
        throw new InvalidOptionException(Errors.format(Errors.Keys.UnknownOption_1,name),name);
      }
      String value=null;
      if (option.hasValue) {
        if (++i >= arguments.length) {
          throw new InvalidOptionException(Errors.format(Errors.Keys.MissingValueForOption_1,name),name);
        }
        value=arguments[i];
      }
      if (options.containsKey(option)) {
        throw new InvalidOptionException(Errors.format(Errors.Keys.DuplicatedOption_1,name),name);
      }
      options.put(option,value);
    }
 else {
      files.add(arg);
    }
  }
  Option option=null;
  String value=null;
  final Console console;
  final boolean explicitEncoding;
  try {
    value=options.get(option=Option.LOCALE);
    locale=(value != null) ? Locales.parse(value) : Locale.getDefault();
    value=options.get(option=Option.TIMEZONE);
    timezone=(value != null) ? TimeZone.getTimeZone(value) : null;
    value=options.get(option=Option.ENCODING);
    explicitEncoding=(value != null);
    encoding=explicitEncoding ? Charset.forName(value) : Charset.defaultCharset();
    value=options.get(option=Option.COLORS);
    console=System.console();
    colors=(value != null) ? Option.COLORS.parseBoolean(value) : (console != null) && X364.isAnsiSupported();
  }
 catch (  IllegalArgumentException e) {
    final String name=option.name().toLowerCase(Locale.US);
    throw new InvalidOptionException(Errors.format(Errors.Keys.IllegalOptionValue_2,name,value),name);
  }
  if (isTest) {
    final StringWriter s=new StringWriter();
    outputBuffer=s.getBuffer();
    out=new PrintWriter(s);
    err=out;
  }
 else {
    outputBuffer=null;
    err=(console != null) ? console.writer() : new PrintWriter(System.err,true);
    if (!explicitEncoding && console != null) {
      out=console.writer();
    }
 else {
      if (explicitEncoding) {
        out=new PrintWriter(new OutputStreamWriter(System.out,encoding),true);
      }
 else {
        out=new PrintWriter(System.out,true);
      }
    }
  }
}

Fixed version (ground truth):
/** 
 * Creates a new sub-command with the given command-line arguments. The   {@code arguments} array is the same array than the one given to the {@code main(String[])} method.The argument at index  {@code commandIndex} is the name of this command, and will be ignored except forthe special  {@value #TEST} value which is used only at JUnit testing time.
 * @param commandIndex Index of the {@code args} element containing the sub-command name.
 * @param arguments    The command-line arguments provided by the user.
 * @param validOptions The command-line options allowed by this sub-command.
 * @throws InvalidOptionException If an illegal option has been provided, or the option has an illegal value.
 */
protected SubCommand(final int commandIndex,final String[] arguments,final EnumSet<Option> validOptions) throws InvalidOptionException {
  boolean isTest=false;
  this.validOptions=validOptions;
  options=new EnumMap<Option,String>(Option.class);
  files=new ArrayList<String>(arguments.length);
  for (int i=0; i < arguments.length; i++) {
    final String arg=arguments[i];
    if (i == commandIndex) {
      isTest=arg.equals(TEST);
      continue;
    }
    if (arg.startsWith(Option.PREFIX)) {
      final String name=arg.substring(Option.PREFIX.length());
      final Option option;
      try {
        option=Option.valueOf(name.toUpperCase(Locale.US));
      }
 catch (      IllegalArgumentException e) {
        throw new InvalidOptionException(Errors.format(Errors.Keys.UnknownOption_1,name),e,name);
      }
      if (!validOptions.contains(option)) {
        throw new InvalidOptionException(Errors.format(Errors.Keys.UnknownOption_1,name),name);
      }
      String value=null;
      if (option.hasValue) {
        if (++i >= arguments.length) {
          throw new InvalidOptionException(Errors.format(Errors.Keys.MissingValueForOption_1,name),name);
        }
        value=arguments[i];
      }
      if (options.containsKey(option)) {
        throw new InvalidOptionException(Errors.format(Errors.Keys.DuplicatedOption_1,name),name);
      }
      options.put(option,value);
    }
 else {
      files.add(arg);
    }
  }
  Option option=null;
  String value=null;
  final Console console;
  final boolean explicitEncoding;
  try {
    value=options.get(option=Option.LOCALE);
    locale=(value != null) ? Locales.parse(value) : Locale.getDefault();
    value=options.get(option=Option.TIMEZONE);
    timezone=(value != null) ? TimeZone.getTimeZone(value) : TimeZone.getDefault();
    value=options.get(option=Option.ENCODING);
    explicitEncoding=(value != null);
    encoding=explicitEncoding ? Charset.forName(value) : Charset.defaultCharset();
    value=options.get(option=Option.COLORS);
    console=System.console();
    colors=(value != null) ? Option.COLORS.parseBoolean(value) : (console != null) && X364.isAnsiSupported();
  }
 catch (  IllegalArgumentException e) {
    final String name=option.name().toLowerCase(Locale.US);
    throw new InvalidOptionException(Errors.format(Errors.Keys.IllegalOptionValue_2,name,value),name);
  }
  if (isTest) {
    final StringWriter s=new StringWriter();
    outputBuffer=s.getBuffer();
    out=new PrintWriter(s);
    err=out;
  }
 else {
    outputBuffer=null;
    err=(console != null) ? console.writer() : new PrintWriter(System.err,true);
    if (!explicitEncoding && console != null) {
      out=console.writer();
    }
 else {
      if (explicitEncoding) {
        out=new PrintWriter(new OutputStreamWriter(System.out,encoding),true);
      }
 else {
        out=new PrintWriter(System.out,true);
      }
    }
  }
}