Я пишу код на 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 как «это», что неверно. Что я хочу спросить:
Возможно ли иметь массив как единственный аргумент в основном методе?
Передайте свои аргументы в кавычках, разделенных запятой или пробелами или любым другим, что вы хотите (например, «12345 12346 6666 333»). Затем в вашем основном методе разделите строку с вашим разделителем. Вы получите массив. – JuniorDev
Я точно не понимаю вопрос, но если вы хотите предоставить несколько строк вашему классу, вам нужно заключить их в двойные кавычки, и вы должны сделать это для каждого аргумента: 'program 'arg1" "arg2" "arg3" ... "argn". – npinti
Аргументы, которые вы передаете в '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