2010-02-16 4 views
3
class anEvent{ 
    String number; 
    String dueTime; 
} 



public static void main(String args[]) { 
     int x = args.length/2; 
     int y = args.length; 
     anEvent [] order = new anEvent [x]; 
     for(int i=0; i<x; i++){ 
     if(i==0){ 
     order[i].number = args[0]; //Line(#) 
     order[i].dueTime = args[1]; 
     } else if (i % 2 == 0){ 
     order[i].number = args[i]; 
     order[i].dueTime = args[i]; 
     } else if (i % 2 != 0){ 
     order[i].number = args[i+1]; 
     order[i].dueTime = args[i+1]; 
     } else if (i == x -1){ 
     order[i].number = args[x-1]; 
     order[i].dueTime = args[x-1]; 
     } 

     } 

Java жалуется, что в приведенном выше фрагменте присутствует строка Null Pointer exceptionion.Индексирование массивов Java

Что случилось?

пс: Я знаю, что фрагмент может быть очищен, но не должно быть никаких проблем на линии #

+1

Вы не указали номер строки? – djc

+1

Пробовал ли вы это сделать с помощью отладчика? Подобная проблема должна быть быстрой, чтобы идентифицировать ее. jdb можно использовать, а затем затмение и netbeans имеют интегрированные отладчики .... –

+0

Я комментирую строку # в коде (извините, если неоднозначно). Я новичок в затмении (и java) Я до сих пор не участвовал в отладчике. – frantic

ответ

6

Когда создается массив, все элементы массива равны нулю. В вашем случае вам нужно заполнить массив new anEvent() экземплярами.

+0

Извините, но: «Дайте человеку рыбу, накормите его на день. Учите человека рыбе, кормите его Для жизни »:-) Я дразня с тобой, но я, хотя это было актуально. –

+0

Я написал anEvent [] order = new anEvent [x]; не так ли? – frantic

+1

@frantic: нет, этого недостаточно; как писал Крис, он создает массив, содержащий только нули. –

1

Сделайте первую строку для цикла:

order[i] = new anEvent(); 

Как есть, вы ничего не инициализируется в массиве (все они нуль), поэтому при попытке получить доступ к полям, которые Вы получаете это исключение.

0

Вы не создали ни одного экземпляра anEvent, определяющего массив (order []), который вы не создаете для него значения по умолчанию.

, а также есть более простой массив для вашего случая:

List events = new ArrayList(x); 
for(int i=0; i<y; i+=2){ 
    anEvent event = new anEvent(); 
    anEvent.number = args[i]; 
    anEvent.dueTime = args[i+1]; 
    events.add(event); 
} 
anEvent[] order = events.toArray(); 
1

Так вы говорите, что это «может быть очищен», я взял на себя смелость так делать:

public class Thing { 
    private String number; 
    private String dueTime; 

    public Thing(String number, String dueTime) { 
     this.number = number; 
     this.dueTime = dueTime; 
    } 

    public static void main(String args[]) { 
     int x = args.length/2; 
     Thing[] order = new Thing[x]; 
     for (int i = 0; i < x; i++) { 
      if (i == 0) { 
       order[i] = new Thing(args[0], args[1]); 
      } else if (i % 2 == 0) { 
       order[i] = new Thing(args[i], args[i]); 
      } else if (i % 2 != 0) { 
       order[i] = new Thing(args[i + 1], args[i + 1]); 
      } 
     } 
    } 
} 

" anEvent "не соответствует капитализированному стандарту Java верблюда, поэтому я переименовал его. «Вещь» не имеет особого значения, но здесь не так много работы. Окончательный пункт else if никогда не может быть достигнут, потому что i % 2 либо равен, либо не является равным нулю, поэтому я бросил его. И, конечно же, я создаю новые вещи, которые избегают проблемы с нулями. Наслаждаться.

1

NullPointerException означает, что вы пытались добавить значение или выполнить метод для чего-то, что оказалось нулевым.

В объектных ссылок Java могут быть назначены ... ну, objects и null

Когда они назначены нуль это исключение:

Object o = null; 
o.toString(); // <- NullPointerException (think of null.toString()) 

Массивы, также являются объектами. Когда вы создаете массив с размером, все «ящики» внутри массива содержат null в качестве ссылки.

Итак:

Object[] array = new Object[10]; 

Создает нечто похожее на следующее:

[null,null,null,null,null,null,null,null,null,null] 

Вот почему, когда вы выполняете:

array[0].toString(); // or order[i].number in your specific example... 

Вы получаете это исключение, потому что эффект точно так же, как:

null.toString(); // or null.number <-- NullPointerException. 

Чтобы решить эту проблему, вы должны назначить правильный объектную ссылку на эту позицию в массив:

for(int i=0; i<x; i++){ 
    order[i] = new anEvent(); 
    ... 
    ... 

Я надеюсь, что это помогает.

Заключительная записка. В Java имена классов начинаются с заглавной, так что ваш класс должен уже быть действительно:

class AnEvent { 
.... 

И, наконец, большая часть исходного Java кода с отступом 4 пробела.

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