“线程中的异常”;“主要”;java.Lang.NullPointerException;无法识别问题

“线程中的异常”;“主要”;java.Lang.NullPointerException;无法识别问题,java,class,error-handling,Java,Class,Error Handling,因为我已经完成了我的代码,我正在调试主程序中的每一步。我一直在打一个空点异常,甚至不到40行。问题是我的setter没有在我的Person类中工作。或者我认为我的二传手坏了。但我首先也相信我的阅读对我的文件不起作用 我试图改变变量,但我就是找不到问题所在,也找不到为什么它不会将名称添加到Person类中。我阅读了此处的NullPointerExceptions,但在代码中找不到需要解决的问题 public class Person { private String firstName;

因为我已经完成了我的代码,我正在调试主程序中的每一步。我一直在打一个空点异常,甚至不到40行。问题是我的setter没有在我的Person类中工作。或者我认为我的二传手坏了。但我首先也相信我的阅读对我的文件不起作用

我试图改变变量,但我就是找不到问题所在,也找不到为什么它不会将名称添加到Person类中。我阅读了此处的NullPointerExceptions,但在代码中找不到需要解决的问题

public class Person {
    private String firstName;
    private String lastName;
    private String address;
    private String city;
    private String state;
    private String zipCode;    

    public Person(String firstName, String lastName, String address, String city, String state, String zipCode) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.address = address;
        this.city = city;
        this.state = state;
        this.zipCode = zipCode;    
    }

    protected Person() {

    }

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getCity() {
        return this.city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getState() {
        return state;
    }

    public void setState(String state) {
        this.state = state;
    }

    public String getZipCode() {
        return zipCode;
    }

    public void setZipCode(String zipCode) {
        this.zipCode = zipCode;
    }

    @Override
    public String toString() {
        return "FirstName: " + firstName + "\nLastName: " + lastName + "\nAddress: " + address + "\nCity: " + city + "\nState: " + state + "\nZipCode: " + zipCode;
    }

    public String toCSV() {
        return this.firstName + "," + this.lastName + "," + this.address + "," + this.city
                + "," + this.state + "," + this.zipCode;
    }

    public void copy(Person p) {       
        firstName = p.firstName;
        lastName = p.lastName;
        address = p.address;
        city = p.city;
        state = p.state;
        zipCode = p.zipCode;
    }

    public void copy(String firstName, String lastName, String address, String city, String state, String zipCode) {
        this.firstName = firstName;
        this.lastName = lastName;
        this.address = address;
        this.city = city;
        this.zipCode = zipCode;
    }

    @Override
    public Person clone() {
        Person p = new Person(this.firstName, this.lastName, this.address, this.city, this.state, this.zipCode);
        return p;
    }
}





public class Customer extends Person{
    private int customerID;
    private double grossSales;

    public Customer(int customerID, double grossSales, String firstName, String lastName, String address, String city, String state, String zipCode) {
        super(firstName, lastName, address, city, state, zipCode);
        this.customerID = customerID;
        this.grossSales = grossSales;
    }

    public Customer(String s, int customerID, double grossSales, String firstName, String lastName, String address, String city, String state, String zipCode) {
        super(firstName, lastName, address, city, state, zipCode);
        copyCSV(s);
    }

    protected Customer() {

    }

    public int getCustomerID() {
        return customerID;
    }

    public void setCustomerID(int customerID) {
        this.customerID = customerID;
    }

    public double getGrossSales() {
        return grossSales;
    }

    public void setGrossSales(double grossSales) {
        this.grossSales = grossSales;
    }

    @Override
    public String toString() {
        return "CustomerID: " + customerID + "\nGrossSales: " + grossSales + super.toString();
    }

    public String toCSV() {
        return this.customerID + "," + this.grossSales + "," + super.toCSV();
    }

    public void copy(Customer c) {
        super.copy(c);
        customerID = c.customerID;
        grossSales = c.grossSales;
    }

    public void copy(int customerId, double grossSales, String firstName, String lastName, String address, String city, String state, String zipCode) {
        super.copy(firstName, lastName, address, city, state, zipCode);
        this.customerID = customerId;
        this.grossSales = grossSales;
    }

    public Customer clone() {
        Customer c = new Customer(this.customerID, this.grossSales, this.getFirstName(), this.getLastName(), this.getAddress(), this.getCity(), this.getState(), this.getZipCode());
        return c;    
    }

    public int compareTo(Customer c) {
        int returnValue = 0;

        if (this.customerID > c.customerID) {
            returnValue = -1;
        } else if (this.customerID < c.customerID) {
            returnValue = 1;
        } else {
            returnValue = 0;
        }

        return returnValue;
    }

    public void copyCSV(String s) {
        List<String> list = new ArrayList<>();

        String[] a = s.split(",");

        list = Arrays.asList(a);

        this.copy(Integer.parseInt(list.get(0)), Double.parseDouble(list.get(1)), list.get(2), 
                list.get(3), list.get(4), list.get(5), list.get(6), list.get(7));
    }

}


public class CustomerList {
    public Customer[] cl;
    public int size; 

    public CustomerList() {
        this.cl = new Customer[4];
    }

    public int size() {
        return this.size = cl.length;
    }

    public Customer get(Integer i) {
        if (i < 0 || i >= size) {
            throw new IndexOutOfBoundsException("null");
        }
        return cl[i];
    }


    public boolean set(Customer c,Integer i) {
        if (i < 0 || i >= size) {
            throw new IndexOutOfBoundsException("null");
        } else {
            cl[i] = c;
            return true;
        }
    } 

    public void add(Customer c) {
        for (int i = 0; i < size; i++) {
            if (cl[i] == null) {
                cl[i] = c;
            } else {
                if (i == size) {
                    Customer[] temp = new Customer[size * 2];
                    for (int j = 0; j < size; j++) {
                        temp[j] = cl[j];
                    }
                    cl[size] = c;
                    size++;

                    }
                }   
            }
    }

    public Customer remove(Integer i) {
        if (i < 0 || i >= size) {
            throw new IndexOutOfBoundsException("null");
        }
            Customer temp = cl[i];
            for (int j = 0; j < cl.length - 1; j++) {
                cl[i] = cl[i + 1];
        }
        return temp;
    }

    @Override
    public String toString() {
      String s = " ";
        double sum = 0;
        for(Customer c: cl){
            if(c == null)
                s = "";
            else
                s += c + " \n";

        }


        for(Customer c: cl){
            if (c ==  null)
                sum += 0;
            else
                sum += c.getGrossSales();

        }

        return s + "\n" +  "Total Gross Sales = " + Double.toString(sum);
    }

    public static CustomerList read(String fn) throws FileNotFoundException {
        Scanner input = new Scanner(new File(fn));
        CustomerList ab = new CustomerList();
        try {
            while(input.hasNextLine()) {
            String currentline = input.nextLine();
            Customer cd = new Customer();
            cd.copyCSV(currentline);
            cd.toCSV();
            ab.add(cd);
            }
        } finally {
            return ab;
    }
    }

    //Write is facing the same problems as read. We can't access the toCSV() method from Customer.
    public static boolean write(CustomerList cl, String fn) throws FileNotFoundException {
        boolean a = false;
        PrintWriter output = new PrintWriter(new File(fn));
       // try {
            for (int i = 0; i < cl.size; i++) {
                Customer cd = new Customer();
                cd.toCSV();

         //   }
       // } catch (FileNotFoundException s) {
         //   System.out.println("File does not exist please try again: ");
           // return a;
        } return a = true;
    }

    //I utilized the sort function it said to and assume this will work as expected.
    public void sort() {
        Arrays.sort(cl);
    }


    public int indexOf(int id) {
        for (int i = 0; i < size; i++) {
            if(cl[i].getCustomerID() == id) {
                return i;
            }
        }
        return -1;
    }

    public boolean update(int id, double amt) {
        boolean test;
        int index = indexOf(id);
        if(index == -1) {
            System.out.println("CustomerID not present");
            test = false;
        } else {
            amt += cl[index].getGrossSales();
            test = true;
        }
        return test;
    }
}




public static void main(String[] args) throws FileNotFoundException {
        boolean b = false;
    // Read file
        System.out.println("Read file");
        CustomerList cl = CustomerList.read("Customers.csv");
        if(cl != null) {
            System.out.println("Read: " + cl.size() + " records");
            System.out.println(cl.toString() + "\n\n\n");
        } else {
            System.out.println("File read error.");
            return;
        }
    // Test get and set for CustomerList
        System.out.println("Test get and set for CustomerList");
        System.out.println("x = " + cl.get(0));
        Customer c = cl.get(0);
        c.setFirstName("Homer"); // This is the line it keeps stopping at.
        cl.set(c, 0);
        System.out.println("x = " + cl.get(0));
        System.out.println("\n\n\n");

这很简单,您要求打印cl.get(0)。它返回null,然后你说Customer c=cl.get(0),这是null,然后你尝试执行c.setFirstName,但是c是null,所以nullPointerException

您正在尝试访问c,但c为空。在能够设置FirstName之前,您需要将其初始化为新客户或使其等于实际客户(不为null)。只要做:

Customer c = new Customer();
c.setFirstName("homer");
如果你的cl不是空的,它就会工作。要避免此类错误,您还可以执行以下操作:

Customer c;
if (cl.get(0) != null){
    c = cl.get(0)
} else {
    c = new Customer();
}
c.setFirstName("homer");

CustomerList.read
返回什么?似乎
cl
的第一个条目是null@derpirscher它应该返回一个新的客户列表。我在我的问题中添加了这个方法。你读到的文件中有多少行?
Customer c;
if (cl.get(0) != null){
    c = cl.get(0)
} else {
    c = new Customer();
}
c.setFirstName("homer");