2013-10-09 3 views
1

Я использую следующий кодЯ получаю NullPointer исключение, когда я пытаюсь поставить строку из BufferedReader в массив строк

public void getIPTableRules(){ 
    ProcessBuilder pb = new ProcessBuilder("/sbin/iptables", "-L"); 
    try { 
     Process p = pb.start(); 
     BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream())); 
     int lineCount = 0; 
     String zeile; 
     while ((zeile = input.readLine()) != null) { 
      System.out.println(zeile); 
      System.out.println(lineCount); 
      line[lineCount] = zeile; 
      lineCount++; 
     } 

     input.close(); 
    } catch (IOException ex) { 
     Logger.getLogger(CheckFirewall.class.getName()).log(Level.SEVERE, null, ex); 
    } 
} 

В System.out печатаются правильно. Переменная линия устанавливается в классе, как:

public String line[]; 

Исключение происходит в строке:

line[lineCount] = zeile; 

Так может кто-то пожалуйста сказать мой, что я делаю неправильно ...

+2

Где Аве у инициализирован ур массив строки? –

+0

Извините, отредактировал мой первоначальный вопрос, так как понял, что я не упоминал об этом. – Margu

+1

Ваш массив 'line', скорее всего, не инициализирован, прежде чем вы его используете. Я предполагаю, что вы его где-то объявляете, но вам нужно убедиться, что он также инициализирован. В конструкторе для класса или в другом месте, которое будет гарантировать выполнение до 'getIPTableRules()', вы должны иметь что-то вроде 'line = new String [100];', хотя вам может быть лучше, если использовать ArrayList или что-то такое дает вам переменную длину. –

ответ

3

По всей вероятности, ваш String[] line массив не инициализирован как

String[] line = new String[100]; 

Но, так как вы не можете быть уверены в точности, сколько строк ваш Process выход может заранее иметь; Я предлагаю использовать List<String> вместо которого вы бы инициализировать, как

и добавить Process выходную линию по линии к нему как

while ((zeile = input.readLine()) != null) { 
    System.out.println(zeile); 
    System.out.println(lineCount); 
    lines.add(zeile); // using List#add() 
    lineCount++; 
} 
+0

Число 100 - это просто проклятое число, которое нужно использовать для определения размера массива как 2, 7 или 1928347. Вы хотите точно определить, какой большой массив вам нужен, или использовать что-то с динамическим размером (или, альтернативно, ручкой Исключения ArrayIndexOutOfBounds). – Izmaki

+1

@ Измаки Да, я тоже не фанат :) Поэтому я предложил использовать «Список». –

+0

Спасибо allot, не мог думать об этом, и он работает именно так, как я хочу! – Margu

3

Вы инициализировали свой линейный массив? Похоже, вы только объявили об этом.

Вы должны были бы сделать что-то вроде этого:

public void getIPTableRules(){ 
    ProcessBuilder pb = new ProcessBuilder("/sbin/iptables", "-L"); 
    line = new String[100]; // or whatever max size you want 
+1

В дополнение к этому, я хотел бы упомянуть, что вы должны тщательно подумать о том, насколько большой массив вы хотите, или использовать коллекцию, размер которой динамичен, например 'ArrayList'. Если вы установите размер массива 'String' равным 2, как только у вас будет какой-то ввод с более чем двумя строками, вы получите новое исключение, которое вы выбрали. – Izmaki

1

Вы не инициализирован ваш массив, определяется только его:

public String line[]; 

необходимо инициализировать его с помощью правильного размера:

public String line[] = new String[SIZE]; 

SIZE - постоянное целое число.

+0

Вы должны указать, как его инициализировать, если это то, что ему нужно делать. – Izmaki

+0

@ Измаки обновил его, спасибо! –

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