2011-12-21 17 views
7

Nie widzę standardowego sposobu sprawdzania, czy wszystkie opcje są dostępne w ciągu String [] do biblioteki interfejsu API Apache. To znaczy - moje opcje są REUIRED w wierszu poleceń, w przeciwnym razie chcę wyjątek do rzucenia.Jak zapewnić, że wszystkie argumenty są dostarczane w interfejsie API Apache Commons?

Próbuję następujący jako obejście, ale coraz wyjątek NullPointer w instrukcji if ...

PosixParser p = new PosixParser(); 
     CommandLine cli=p.parse(options,args); 
     for(Object o : options.getOptions()) 
     { 
      Option op = (Option)o; 
      if(cli.getOptionValue(op.getName())) 
      throw new ParseException("Missing argument ! " + op.getArgName() + ":"+op.getDescription()); 
    } 

UPDATE ON TO: metoda getopt() zdaje się dostarczać argumentów krótką nazwę.

Jednak, jeśli zamieniam op.getName() na opt.getLongName() ... to działa!

W każdym razie .. Mam 2 pytania:

1) Dlaczego opcja mają zerową nazwisko, jeszcze niezerowym longname?
2) Czy istnieje sposób, aby po prostu upewnić się, że wszystkie opcje są dostarczane String []? Na przykład, chciałbym zadzwonić:

if(! options.isAllProvided()) 
    throw new ParseException("You are missing some options ! " + StringUtils.join(userInputArray,',')); 
+0

Po prostu zauważyłem: Aby uzyskać opcję po nazwie skróconej, należy wywołać metodę getOpt() zamiast metody getArgName() lub dowolnej innej metody. – jayunit100

Odpowiedz

9

Oto jak można ustawić opcję wymagane:

Option logfile = OptionBuilder.withArgName("file") 
      .isRequired() // make it required 
      .hasArg() 
      .withDescription( "use given file for log") 
      .create("logfile"); 

(nie sądzę, istnieje łatwy sposób, aby wszystkie opcje wymagane w jeden krok)

+1

hmmm ... to jest złe. wygląda na to, że ten api potrzebuje zmartwychwstania. – jayunit100

+0

Musisz zaznaczyć odpowiednie opcje. Jeśli brakuje niektórych opcji, otrzymasz wyjątek zawierający listę brakujących opcji. –

+0

Rzeczywiście jest to gadatliwe i brzydkie, ale uważam, że tworzenie klasy Factory za pomocą metod takich jak 'makeRequiredOption' może znacznie poprawić czytelność twojej głównej klasy. – bcoughlan

Powiązane problemy