当我尝试使用进程ID填充2D数组时,我得到nullpointerexception,它是2D,因为每个系统都有一个无限的PID列表,我需要最终将它返回到我的主代码(现在设置为void)只是一个原型测试功能)。
任何想法都会很棒
private void testfunctionA (List<String> additionalPC) {
// A 2d array that will contain a list of pids for each system - needs to be strings and not integers
String[][] pidCollection = new String[additionalPC.size()][];
// Go through one system at a time
for (int i=0; i < additionalPC.size(); i++) {
// Get pids for apple per system
String listofpids = Driver.exec("ssh " + additionalPayloads.get(i) + " ps -ef | grep -i apple | grep -v \"grep -i apple\" | awk \\' {print $2}\\'");
// Works ok for printing for one system
System.out.println(listofpids);
// put the list of pids into a string array - they are separated by rows
String[] tempPid = listofpids.split("\n");
// Put the string array into the 2d array - put this fails with a NPE
for (int j=0; j < tempPid.length; j++) {
pidCollection[i][j] = tempPid[j];
}
System.out.println(pidCollection);
}
答案 0 :(得分:1)
您已经创建了2D阵列,但阵列中充满了null
1D阵列。 2D阵列中的每个元素都需要创建一维数组。您已使用tempPid
创建了它;只是使用它。而不是
for (int j=0; j < tempPid.length; j++) {
pidCollection[i][j] = tempPid[j];
}
只需使用
pidCollection[i] = tempPid;
答案 1 :(得分:1)
您需要初始化pidCollection的每个元素:
String[] tempPid = listofpids.split("\n");
pidCollection[i] = new String[tempPid.length];
// Put the string array into the 2d array - put this fails with a NPE
for (int j=0; j < tempPid.length; j++) {
pidCollection[i][j] = tempPid[j];
}
或者,在这种情况下,更简单:
pidCollection[i] = listofpids.split("\n");
答案 2 :(得分:0)
简短的回答,您需要定义数组的第二个维度
String[][] pidCollection = new String[additionalPC.size()][?????]; //this initialises the` first axis
答案很长: 你并不是在这条线上做到这一点,你可以根据每个第一维的具体情况来做,例如
pidCollection[i]=new String[tempPid.length] //this initialised the second axis for a particular i
但你需要在某个时候做到这一点,最简单的解决方案是立即定义两个维度,除非你有理由不这样做。虽然我认为在这种情况下可能不适用,但请使用个案方法