2013-03-21 2 views
0

Я получаю nullpointerexception, когда пытаюсь заполнить 2D-массив идентификаторами процессов, это 2D, так как для каждой системы существует неограниченный список PID, и мне нужно в конечном итоге вернуть это обратно мой основной код (теперь установлен на void, поскольку только тестовая функция прототипа).java многомерный массив с ошибкой nullpointer

Любые идеи, было бы здорово

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); 


    } 

ответ

1

Вы создали 2D массив, но массив полон null 1D массивов. Каждый элемент в 2D-массиве должен иметь 1D-массив. Вы уже создали его с помощью tempPid; просто используйте его. Вместо

for (int j=0; j < tempPid.length; j++) { 
    pidCollection[i][j] = tempPid[j]; 
} 

просто использовать

pidCollection[i] = tempPid; 
+0

Спасибо, это работает! также понял, что я не должен печатать многомерный массив, как это было в моем примере. – Twosingleton

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"); 
+0

Спасибо за ответ – Twosingleton

0

Короткий ответ, вам нужно определить t он второй Dimention вашего массива

String[][] pidCollection = new String[additionalPC.size()][?????]; //this initialises the` first axis 

Длинный ответ: Вы не abliged сделать это на этой линии, и вы можете сделать это на индивидуальной основе для каждого первого Dimention, например

pidCollection[i]=new String[tempPid.length] //this initialised the second axis for a particular i 

, но вам нужно сделать это в какой-то момент, самым простым решением является определение обоих параметров одновременно, если у вас нет причин не делать этого. Хотя я думаю, что это может быть неприменимо в этом случае, поэтому используйте случайный метод

+0

Невозможно заранее узнать размер списка PID, поэтому я не могу дать фиксированную длину заранее. И предыдущее решение сработало. Спасибо за ввод, хотя – Twosingleton

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