1

Я пишу код на Java, чтобы получить аргументы от сканера. У меня есть несколько классов: ChartToHtml.java, ExecutionProperties.java, ExecutionV2.java, TestCase.java, TestCaseList.java, Section.java и все они будут вызываться из ImplTest.java.передать аргумент массива из командной строки вместо сканера в java

Они работают нормально, когда я запускаю либо из затмения, либо из командной строки с помощью сканера. Проблема в том, когда я хочу выполнить их с помощью аргументов программы и передать аргументы в одной строке. Он считает ввод как единый String, но я должен использовать String[] в качестве входных данных для класса Section.

Вот мой класс Раздел и классы ImplTest

public class Section { 
    Ini.Section root; 
    ArrayList<String> StringList = new ArrayList<String>(); 
    ArrayList<TestCase> TCList = new ArrayList<TestCase>(); 
    String sectionSearched; 
    String section; 
    String filenameSearched; 

    public Section(){ 

    } 

    public Section (String filenameSearched, String sectionSearched) { 
     this.sectionSearched = sectionSearched; 
     this.filenameSearched = filenameSearched; 
    } 

     public ArrayList<String> findSection(String filename, String... wanted) throws IOException, IOException { 
      Ini myIni = new Ini(new File (filename)); 
      for (String d : wanted) { 
       root = myIni.get(d); 

        for (String name : root.keySet()){ 
         StringList.add(root.get(name)); 
        } 
       } 
       return StringList; 
     }  

     public ArrayList<TestCase> convertStringToTestCase(ArrayList<String>StringList){ 
      for (int i = 0; i < StringList.size(); i++) { 
       String name = StringList.get(i) ; 
       TestCase tc = new TestCase (name); 
       TCList.add(tc); 
      } 
      return TCList; 
     } 
     public String[] getSection(int NumOfSec){ 
      Scanner scanner = new Scanner(System.in); 
      while (true) { 
       System.out.println("Input section name:"); 
       section = scanner.nextLine(); 
       for (int i =0; i<NumOfSec; i++){ 
        String token[]= section.split(" "); 
        System.out.println(Arrays.toString(token)); 
        return token; 
       } 

      } 
     }  
} 

Мой Главный класс

public class ImplTest { 

public static void main(String[] args) throws IOException, ConfigurationException, TemplateException { 
    ExecutionV2 ex = new ExecutionV2(); 
    TestCaseList tc = new TestCaseList(); 
    Section s = new Section(); 
    ChartToHtml chr= new ChartToHtml(); 
    ExecutionProperties ep = new ExecutionProperties(); 
    ImplTest imp = new ImplTest(); 

    String filename = ex.getcfg(); 
    String []sec = ex.getSection(); 
    int it = ex.getIterationMax(); 
    String runTCpath =ex.getRunTCdir(); 
    String dir = chr.getChartDir(); 

    ArrayList<TestCase> TClist = s.convertStringToTestCase(s.findSection(filename, sec)); 
    ex.executeTestCaseList(TClist, it , runTCpath); 
    ex.getTCAttribute(TClist); 

    ep.setConfigProperties(tc.getTCPassed(), tc.getTCFailed()); 
    chr.generateHistoryTable(); 
    chr.generateChartAndTableTemplate(tc.getTCPassed(), tc.getTCFailed(),ex.getNameList(), ex.getPassedList().toString(), ex.getItList().toString(),dir); 
    } 
} 

Тогда я изменил главный класс, чтобы передать аргументы через конфигурации запуска и передать эту одну строку:

ArrayList<TestCase> TClist = s.convertStringToTestCase(s.findSection(**args[0]**, **args[1]**)); 
    ex.executeTestCaseList(TClist, Integer.parseInt(**args[2]**) , **args[3]**); 
    ex.getTCAttribute(TClist); 

    ep.setConfigProperties(tc.getTCPassed(), tc.getTCFailed()); 
    chr.generateHistoryTable(); 
    chr.generateChartAndTableTemplate(tc.getTCPassed(), tc.getTCFailed(),ex.getNameList(), ex.getPassedList().toString(), ex.getItList().toString(), **args[4]**); 

и передать эту строку в программные аргументы

C:\\Users\\syuniyar\\.EasyTest\\4\\ccl\\config\\test2.cfg 12346 5 C:\\EasyTest\\4\\bin\\runTC.exe C:\\Users\\syuniyar\\EclipseWS\Test3\\chart.html

он отлично работает. Однако, когда я изменить входной сигнал от ...12346... к ...12346 12345..., я получаю такую ​​ошибку:

Exception in thread "main" java.io.IOException: Cannot run program "5": CreateProcess error=2, The system cannot find the file specified 

Я также попробовать с VM аргументами, но возможностью System.getProperty() предназначена только для одной строки. Я знаю, почему я получаю эту ошибку, потому что она читает 12345 как «это», что неверно. Что я хочу спросить:

Возможно ли иметь массив как единственный аргумент в основном методе?

+0

Передайте свои аргументы в кавычках, разделенных запятой или пробелами или любым другим, что вы хотите (например, «12345 12346 6666 333»). Затем в вашем основном методе разделите строку с вашим разделителем. Вы получите массив. – JuniorDev

+0

Я точно не понимаю вопрос, но если вы хотите предоставить несколько строк вашему классу, вам нужно заключить их в двойные кавычки, и вы должны сделать это для каждого аргумента: 'program 'arg1" "arg2" "arg3" ... "argn". – npinti

+0

Аргументы, которые вы передаете в 'C: \ Users \ syuniyar \ .EasyTest \ 4 \ ccl \ config \ test2.cfg',' 12346', '5',' C: \ EasyTest \ 4 \ bin \ runTC.exe' , 'C: \ Users \ syuniyar \ EclipseWS \ Test3 \ chart.html' входят как массив, по одному аргументу за значение в массиве. Я бы распечатал аргументы, которые у вас есть с 'System.out.println' (и for-loop), чтобы убедиться, что вы знаете, какие аргументы приходят туда. Я думаю, вы решите свою проблему. – xbakesx

ответ

0

Чтобы ответить на ваш вопрос «Возможно ли иметь массив как [a] один аргумент в [a] основном методе?», No. Основной метод принимает аргументы в виде одного массива объектов String (обычно называемого «args»). Каждая из этих строк считается аргументом.

При выполнении основного метода из командной строки эти аргументы появляются после имени программы и разделяются пробелами. Они загружаются в массив и передаются в основной метод.

Как упоминалось в комментариях (особенно @Ismail Kuruca), если для вас важно передать несколько строк в качестве одного аргумента, вы можете объединить строки, чтобы сделать ваши аргументы технически одной Строкой и, следовательно, рассматриваться как один аргумент.

+0

Спасибо за объяснение. Я понимаю это из Исмаила Куруки – user3922604

Смежные вопросы