2013-07-30 3 views
0

Выполнение кода для назначения класса, а im получает исключение нулевого указателя в этих строках (выделено полужирным курсором и выделено курсивом в моем коде): Я не понимаю, как эти строки указывают на пустое пятно, как и первое, это мой код, пытающийся установить имя для определенного места, но apparantly я не могу, потому что он равен нулю, хотя я установлен в 0, первое имя установлено на пустую строку и т. д. Помогите!Как исправить исключение нулевого указателя

public class Passenger { 
    String FirstName; 
    String LastName; 

    void getName() { 
     FirstName = " "; 
     LastName = " "; 
    } 

    void getName(String first, String last) { 
     FirstName = first; 
     LastName = last; 
    } 

    String getFirst() { 
     return FirstName; 
    } 

    String getLast() { 
     return LastName; 
    } 

    void setFirstName(String tempfirst) { 
     FirstName = tempfirst; 
    } 

    void setLastName(String templast) { 
     LastName = templast; 
    } 

    void printNames() { 
     System.out.printf("%s %s\n", this.getFirst(), this.getLast()); 
    } 

    public static void main(String[] args) { 
    } 
} 

public class WaitingList extends Passenger { 
    Passenger[] waitlist = new WaitingList[10]; 

    WaitingList(){ 
     for(int i = 0; i<10;i++){ 
      ***waitlist[i].setFirstName("");*** 
      waitlist[i].setLastName(""); 
     }} 

    void printWaitingList() { 
     for (int j = 0; j < 10; j++) 
      waitlist[j].printNames(); 
    } 

    void setPassenger(int i, Passenger tempPass) { 
     waitlist[i] = tempPass; 
    } 

    Passenger getPassenger(int i) { 
     return waitlist[i]; 
    } 

    public static void main(String[] args) { 
    } 

} 

import java.io.Console; 
import java.util.Scanner; 

public class SeatingChart extends WaitingList { 
    Passenger[][] pass = new Passenger[10][4]; 

    SeatingChart() { 
     for (int row = 0; row < 10; row++) { 
      for (int col = 0; col < 4; col++) { 
       pass[row][col] = new Passenger(); 
      } 
     } 
    } 

    void printSeatingChart() { 
     for (int row = 0; row < 10; row++) { 
      for (int col = 0; col < 4; col++) { 
       System.out.print(pass[row][col].getFirst() + "\t"); 
       System.out.print(pass[row][col].getLast() + "\n"); 
      } 
     } 
    } 

    String getSeatChoicefromUser() { 
     Scanner scanner = new Scanner(System.in); 
     System.out.print("Enter preferred seat (row, column): "); 
     String seat = scanner.next(); 
     return seat; 
    } 

    void setPassenger(int row, int col, Passenger temppass) { 
     pass[row][col] = temppass; 
    } 

    Passenger getPassenger(int row, int col) { 
     return pass[row][col]; 
    } 

    Passenger search(String first, String last) { 
     Passenger search = new Passenger(); 
     for (int row = 0; row < 10; row++) { 
      for (int col = 0; col < 4; col++) { 
       String tempfirst = pass[row][col].getFirst(); 
       String templast = pass[row][col].getLast(); 
       if (tempfirst.equals(first)) { 
        if (templast.equals(last)) { 
         search = pass[row][col]; 
         removePassenger(row, col); 
        } 
       } else { 
        search = null; 
        System.out.print("\nPassenger not found\n"); 
       } 
      } 
     } 
     return search; 
    } 

    void removePassenger(int row, int col) { 
     pass[row][col].setFirstName(null); 
     pass[row][col].setLastName(null); 
    } 

    Passenger reconcileWithWaitingList() { 
     int i = 0; 
     Passenger pass = new Passenger(); 
     String tempfirst = waitlist[i].getFirst(); 
     String templast = waitlist[i].getLast(); 
     if (tempfirst.equals(null)) { 
      if (templast.equals(null)) 
       System.out.print("\nWaiting list is empty\n"); 
     } else { 
      pass = waitlist[i]; 
      for (i = 0; i < 10; i++) 
       waitlist[i] = waitlist[i + 1]; 
     } 
     return pass; 
    } 

    public void addPassengerToWaitingList(int wrow, int wcol) { 
     Passenger addPass = new Passenger(); 
     Scanner sc = new Scanner(System.in); 
     System.out.print("Enter first name: "); 
     String tempfirst = sc.next(); 
     System.out.print("Enter last name: "); 
     String templast = sc.next(); 
     addPass = search(tempfirst, templast); 
     if (addPass == null) { 
      String tempfirst1 = pass[wrow][wcol].getFirst(); 
      String templast1 = pass[wrow][wcol].getLast(); 
      if (tempfirst1.equals(null)) { 
       if (templast1.equals(null)) { 
        pass[wrow][wcol].setFirstName(tempfirst1); 
        pass[wrow][wcol].setLastName(templast1); 
       } 
      } 
     } else 
      System.out.print("Passenger already present!"); 
    } 

    public static void main(String[] args) { 
    } 
} 
+3

Не пытайтесь «жирным шрифтом» или «начертить» код. Для этого используйте комментарии к коду. –

+0

Вы не инициализируете элементы массива объектов, попробуйте их инициализировать с помощью нового ключевого слова –

ответ

4

Ваш массив waitlist содержит нулевые элементы. Сначала вы должны инициализировать элементы, прежде чем пытаться их использовать.

Passenger[] waitlist = new WaitingList[10]; 

WaitingList(){ 
    for(int i = 0; i<10;i++){ 
     waitlist[i] = new WaitingList(); // *** first create an element 
     waitlist[i].setFirstName(""); // *** before using it. 
     waitlist[i].setLastName(""); 
    } 
} 

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


Редактировать
Что касается Вашего комментария,

, который дал мне ошибку переполнения стека на одной и той же линии

Это совершенно новая ошибка - вы получили некоторый рекурсивный код там. Эта проблема связана с этим кодом:

public class WaitingList extends Passenger { 
    Passenger[] waitlist = new WaitingList[10]; 
  • Первый выключен, WaitingList не должен быть подклассом пассажира. Это не имеет смысла, поскольку концепция списка ожидания не является специализированным случаем концепции пассажира. Другими словами, он не удовлетворяет критериям «есть-а» для наследования. Скорее он выполняет критерии «есть-а» - в списке ожидания есть пассажиры, а не пассажир. Поэтому используйте композицию.
  • Далее класс WaitingList не должен создавать и заполнять массив WaitingLists, так как это приведет к бесконечной рекурсии с каждым новым объектом WaitingList, создающим 10 новых объектов WaitingList, каждый из которых создаст еще 10 объектов WaitingList, каждый из которых будет ... Ты видишь проблему? Вместо этого класс WaitingList, вероятно, должен унаследовать от других классов и должен содержать массив (или ArrayList) объектов Passenger, а не объекты WaitingList.

У вашего кода есть много проблем, и вы можете перезагрузить этот проект.

+0

, который дал мне ошибку переполнения стека в той же строке. –

+0

@AbdullahTamimi: Это совершенно новая ошибка - у вас есть какой-то рекурсивный код! –

+0

@AbdullahTamimi: у вашего кода много проблем. См. Править для ответа. –

3

enter image description here


Эй вы объявили array of references Что вам нужно сделать, это инициализировать эти пустые ссылки, прежде чем использовать их

for(int i=0; i< waitlist.length;++i){ 
    waitlist[i] = new waitlist(); 
} 

затем вызвать вашу функцию

-2

Заменить код класса Пассажирское с этим.Have Fun :)

public class Passenger { 
     String FirstName = ""; 
     String LastName = ""; 
     void getName(){ 
      FirstName=""; 
      LastName="";} 
     void getName(String first, String last){ 
      if(first != null) 
      {  
       FirstName=first; 
      } 
     else 
     { 
      FirstName = ""; 
     } 
     if(last != null) 
     { 
      LastName=last; 
     } 
     else 
     { 
      LastName = ""; 
     } 
     } 
     String getFirst(){ 
      return FirstName;} 
     String getLast(){ 
      return LastName;} 
     void setFirstName(String tempfirst){ 
      if(tempfirst == null) 
      { 
      FirstName = ""; 
      } 
      else 
      {   
      FirstName=tempfirst; 
      } 
     } 
     void setLastName(String templast){ 
      if(templast == null) 
      { 
      LastName=""; 
      } 
      else 
      { 
      LastName=templast; 
      } 
     } 
     void printNames(){ 
      System.out.printf("%s %s\n", this.getFirst(), this.getLast()); 
     } 
+1

Просто предоставление кодовых решений, не давая хороших описательных ответов, только поощряет кодекс просить не учиться. -1. –

+1

ok, Устанавливая имя firstname и lastName в классе Passenger, у вас нет никаких проверок для нулевых значений. Поэтому предположим, что ваше первое имя равно null. Затем вы вызываете getName («Ahmad», «Hover»); Теперь это будет firstname = «Ahmad». Это создаст исключение nullpointer, потому что firstname имеет значение NULL, не указывая на какое-либо местоположение. В коде выше, я просто добавил несколько проверок, которые будут исключать исключение нулевого указателя. Благодаря, –

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