-1

I'm relatively new to Java, and I'm trying to use composition within a created a Resident class which extends another class, Person. I'm getting a null pointer exception error that points to this line of code:

equipment.setEquipment(hasInitialEquipment);

in my constructor in the resident class. I know that I must be doing something wrong but I'm really not sure what it is. Any help would be greatly appreciated.

public class Driver1 {

public static void main(String[] args) {
   Resident a = new Resident("Bob Smith", 74, "Male", 317, 'C', false, false, "");

   a.writeOutput();
   System.out.println();
 } 
}

The class Person

public class Person {

    private String name;

    public Person()
    {
        name = "No name given";
    }

    public Person(String initialName)
    {
        name = initialName;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String newName)
    {
        name = newName;
    }

    public void writeOutput()
    {
        System.out.println(name);
    }
}

The Class Resident

public class Resident extends Person {

public static final int DEFAULT_AGE = 0;
public static final int DEFAULT_ROOM = 0;


private int age;
private String gender;
private int room;
private char building;
private boolean supervised;

private Equipment equipment;

public Resident() 
{
    super();
    age = DEFAULT_AGE;
    gender = "Undeclared";
    room = DEFAULT_ROOM;
    building = '0';
    supervised = false;

}

public Resident(String initialName, int initialAge, String initialGender, 
    int initialRoom, char initialBuilding, boolean needsSupervision,
    boolean hasInitialEquipment, String initialEquipmentType) 
{
    super(initialName);
    age = initialAge;
    gender = initialGender;
    room = initialRoom;
    building = initialBuilding;
    supervised = needsSupervision;
    equipment.setEquipment(hasInitialEquipment);
    equipment.setEquipmentType(initialEquipmentType);

}

public int getAge()
{
    return age;
}

public void setAge(int newAge)
{
    age = newAge;
}

public String getGender()
{
    return gender;
}

public void setGender(String newGender)
{
    gender = newGender;
}

public int getRoom()
{
    return room;
}

public void setRoom(int newRoom)
{
    room = newRoom;
}

public char getBuilding()
{
    return building;
}

public void setBuilding(char newBuilding)
{
    building = newBuilding;
}

public boolean getSupervised()
{
    return supervised;
}

public void setSupervised(boolean newSupervised)
{
    supervised = newSupervised;
}

public boolean getEquipment()
{
    return equipment.getEquipment();
}        

public String getEquipmentType() 
{
    return equipment.getEquipmentType();
}

@Override
public void writeOutput()
{
    System.out.println(getName());
    System.out.println("Age: " + age);
    System.out.println("Gender: " + gender);
    System.out.println("Room: " + room);
    System.out.println("Building: " + building);
    if(supervised){
        System.out.print("***Supervised Ambulation only***");
    if(getEquipment())
        System.out.println(getEquipmentType());
    }
 }
}

The Class Equipment

public class Equipment {

private boolean equipment;
private String equipmentType;

public Equipment() 
{
    equipment = false;
    equipmentType = null;
}

public Equipment(boolean initialEquipment, String initialEquipmentType) 
{
    equipment = initialEquipment;
    equipmentType = initialEquipmentType;
}        

public boolean getEquipment()
{
    return equipment;
}

public void setEquipment(boolean newEquipment)
{
    equipment = newEquipment;
}

public String getEquipmentType() 
{
    return equipmentType;
}

public void setEquipmentType(String newEquipmentType)
{
    equipmentType = newEquipmentType;
}

public void WriteOutput() 
{
    if(equipment)
        System.out.println("Equipment: " + equipmentType);

 }
}
  • You don't initialise `equipment` anywhere. What do you expect to happen? – bcsb1001 Oct 27 '17 at 00:20
  • You are doing composition correctly, ie. a `Resident` _has_ an `Equipment`. However, you have simply failed to initialise it correctly. See the related (duplicate) question for how to resolve this. – dave Oct 27 '17 at 00:21

1 Answers1

2

You declared an equipment inside Resident

private Equipment equipment;

And you called a method on it before initializing it. You must initialize this variable before using it. Put the following into the Resident constructor before calling methods on equipment.

equipment = new Equipment();

When you declare a non-primitive variable, this variable stays null until you initialize it. That's why you are getting NullPointerException.

Gabriel
  • 1,922
  • 2
  • 19
  • 37