2012-03-22 6 views
1

Хорошо, я получаю NPE, который я не могу понять, и это заставляет меня быть абсолютно батти. У меня есть связанный список объектов резервирования и 2d массив булевых, чтобы следить за имеющиеся места:Получение NPE на обработанном массиве логических значений

class ResList 
{ 
    private Reservation head; 
    private boolean [][] seats; 

    ResList() 
    { 
     head = null; //empty list 
     boolean[][] seats = new boolean[5][25]; 
    } 

Я также получил метод isAvailable(), чтобы определить, доступно ли место:

boolean isAvailable(int f, int s) 
    {   
     if(f<0 || f>4 || s < 0 || s > 24) 
      return false; 
     else 
      return !seats[f][s]; // this line throws the NPE 
    } 

Но когда я делаю это:

jcbSeat = new JComboBox();   
     for(int i = start; i <= stop; i++) 
     {   
      if(list.isAvailable(selectedFlight, i)) 
       jcbSeat.addItem(i+1); 
     } 

я получаю NPE, где отмечено. Я добавил несколько строк отладки в конструктор ResList и могу получить доступ к местам [] [] там просто отлично, но когда я выполняю метод, ка-бум: NPE. Что здесь происходит?

+0

Спасибо всем. Я просто идиот. Это раздражительно. – MikeTheLiar

+0

Мы называем это мозговой пердит. У каждого есть их, и обычно требуется, чтобы кто-то еще указал их, чтобы обеспечить соответствующее смущение 8-) – Robin

+0

Для тех, кто хочет избежать этого и иметь Eclipse (теневые конфликты). Windows-> Настройки-> Java-> Компилятор-> Ошибки/Предупреждения-> Именование теневиков и конфликты –

ответ

6

Ваш конструктор инициализирует локальную переменную seats, а не переменную экземпляра seats. Попробуйте с:

ResList() 
{ 
    head = null; //empty list 
    seats = new boolean[5][25]; 
} 
+0

Я идиот. Спасибо что подметил это. – MikeTheLiar

+0

@ Mong134 нет ваш нет. Это своего рода недостаток на языке IMHO (я имею в виду, что Java явно многословна почти везде). Я избегаю этого, всегда делая «this.seats =».Вы также можете включить настройку в своей среде IDE, чтобы указать их. –

+0

@ Адам Гент, я должен был поймать его сам. Работал над этим проектом слишком долго. – MikeTheLiar

1

в вашем конструкторе remove boolean [] []; вы создаете новую (локальную) переменную вместо инициализации своей переменной экземпляра.

То, что вы сделали, называется теневыми переменными; скрывая переменную экземпляра, затеняя ее локальной переменной. Это обычный источник для поиска ошибок.

2
boolean[][] seats = new boolean[5][25]; 

Эта линия не заходящего поле класса seats - это создает новую переменную, внутренний в конструкторе. Вместо этого сделать

seats = new boolean[5][25]; 
1

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

Просто удалите boolean[][] перед вашим назначением на seats, чтобы превратить вашу декларацию + инициализации в нормальное назначение:

seats = new boolean[5][25]; 
1

Вы строите переменную неправильно. Вы создаете локальную переменную, не устанавливающую поле. Изменение

boolean[][] seats = new boolean[5][25]; 

к

seats = new boolean[5][25]; 
Смежные вопросы