code: int run(String[] args) {
          try {
              handleOptions(args);
  
              // the following gives consistent behavior with javac
              if (classes == null || classes.size() == 0) {
                  if (options.help || options.version || options.fullVersion)
                      return EXIT_OK;
                  else
                      return EXIT_CMDERR;
              }
  
              try {
                  return run();
              } finally {
                  if (defaultFileManager != null) {
                      try {
                          defaultFileManager.close();
                          defaultFileManager = null;
                      } catch (IOException e) {
                          throw new InternalError(e);
                      }
                  }
              }
          } catch (BadArgs e) {
              reportError(e.key, e.args);
              if (e.showUsage) {
                  printLines(getMessage("main.usage.summary", progname));
              }
              return EXIT_CMDERR;
          } catch (InternalError e) {
              Object[] e_args;
              if (e.getCause() == null)
                  e_args = e.args;
              else {
                  e_args = new Object[e.args.length + 1];
                  e_args[0] = e.getCause();
                  System.arraycopy(e.args, 0, e_args, 1, e.args.length);
              }
              reportError("err.internal.error", e_args);
              return EXIT_ABNORMAL;
          } finally {
              log.flush();
          }
      }
docs: Compiler terminated abnormally