首页 > 解决方案 > 尝试对对象数组进行排序时出现 NullPointerException

问题描述

我被困在为什么我的代码NullPointerException在对我的对象数组进行排序时给了我一个问题,而且我不太确定我的错误在哪里。

Exception in thread "main" java.lang.NullPointerException
    at java.base/java.util.ComparableTimSort.countRunAndMakeAscending(ComparableTimSort.java:320)
    at java.base/java.util.ComparableTimSort.sort(ComparableTimSort.java:202)
    at java.base/java.util.Arrays.sort(Arrays.java:1250)
    at Program7b.sortCust(Program7b.java:63)
    at Program7b.main(Program7b.java:16)

我的主要方法调用其他方法和myPrintFile方法读取和输入文件并将对象存储在数组中Customers

public static void main(String[] args) throws IOException {
    File k = new File("program7b.txt");
    Scanner in = new Scanner(k);
    Customer[] obj1 = new Customer[in.nextInt()];
    printFile(obj1);
    sortCust(obj1);
}
public static void printFile(Customer [] obj) throws IOException {
    File f = new File("program7b.txt");
    Scanner in = new Scanner(f);

    int count = 0;
    obj = new Customer[in.nextInt()];
    while (in.hasNext()) {
        int id = in.nextInt();
        String name = in.next();
        String email = in.next();
        double balance = in.nextDouble();

        if (in.hasNextDouble()) {
            double tax = in.nextDouble();
            double afterT = tax * balance;
            obj[count] = new NonExempt(id, name, email, balance, tax, afterT);
        }
        else if (in.hasNext()) {
            String why = in.next();
            obj[count] = new TaxExempt(id, name, email, balance, why);
        }
        in.nextLine();
        count++;
    }

    in.close();
    // looping throught the array and printing every customer object
    for (int i = 0; i < count; i++) {
        System.out.println(obj[i]);
        // System.out.println("Tax Type: " + ((TaxExempt)obj[i]).getExempt());
    }
    //return obj;
}

我的排序方法

public static void sortCust(Customer [] obj) {
    for (int i = 0; i < obj.length; i++)
        System.out.println(obj[i]);

    Arrays.sort(obj);

    for(int i = 0; i < obj.length; i++)
        System.out.println(obj[i]); 
}

我的compareTo方法

@Override
public int compareTo(Customer a){
    if(this.getId < a.getId())
        return -1;
    if(this.getId == a.getId())
        return 0; 
    else return 1;
}

修改后的代码我修复了我的调用方式printFile()

   Customer[] obj = printFile();
    sortCust(obj);

}

public static Customer[] printFile() throws IOException {
    File f = new File("program7b.txt");
    Scanner in = new Scanner(f);
    int count = 0;
    Customer[] obj = new Customer[in.nextInt()];
    while (in.hasNext()) {
        int id = in.nextInt();
        String name = in.next();
        String email = in.next();
        double balance = in.nextDouble();

        if (in.hasNextDouble()) {
            double tax = in.nextDouble();
            double afterT = tax * balance;
            obj[count] = new NonExempt(id, name, email, balance, tax, afterT);
        }

        else if (in.hasNext()) {
            String why = in.next();
            obj[count] = new TaxExempt(id, name, email, balance, why);
        }
        in.nextLine();
        count++;

    }

    in.close();
    // looping throught the array and printing every customer object
    for (int i = 0; i < count; i++) {
        // System.out.println(obj[i]);

    }
    return obj;

标签: javaarraysobject

解决方案


试试这个片段并确保你的数组项被填充:

*** 如果您确定您的数组中填充了值,则这适用于数组。

import java.util.Arrays;
import java.util.*; 
import java.lang.*; 
import java.io.*; 

public class Main
{
    public static void main(String[] args) {

        User[] users = {new User(2, "user2"), new User(1, "user1"), new User(3, "user3")};

        Arrays.sort(users); 

        for (int i = 0; i < users.length; i++) {
            System.out.println(users[i].getUsername());
        }

    }
}

 class User implements Comparable<User> {

    private int id;
    private String username;


    public String getUsername() {
        return username;    
    }

    public int getId() {
        return id;
    }

    public User(int id, String username) {
        this.id = id;
        this.username = username;
    }

    @Override
    public int compareTo(User user) {        
        if(id < user.getId())
            return -1;
        if(id == user.getId())
            return 0; 
        else return 1;
    }
}

*** 使用扫描仪试试这个片段:

import java.io.*;
import java.util.Scanner;
import java.util.ArrayList;
import java.util.Collections;

public class Main
{
    public static void main(String[] args) {

        File k = new File("program7b.txt");
        try {
            Scanner scanner = new Scanner(k);

            ArrayList<User> users = new ArrayList<User>();


            while (scanner.hasNext()) {
                int id = Integer.parseInt(scanner.next());
                users.add(new User(id));
            }

            System.out.println("Unsorted: ");

            for (int i = 0; i < users.size(); i++) {
                System.out.println(users.get(i).getId());
            }

            Collections.sort(users);

            System.out.println("Sorted: ");
            for (int i = 0; i < users.size(); i++) {
                System.out.println(users.get(i).getId());
            }

            scanner.close();
        } catch (FileNotFoundException ex) { 
            System.out.println(ex.getMessage());
        }
    }
}

class User implements Comparable<User> {
    private int id;

    public int getId() {
        return id;
    }

    public User(int id) {
        this.id = id;
    }

    @Override
    public int compareTo(User user) {        
        if(id < user.getId())
            return -1;
        if(id == user.getId())
            return 0; 
        else return 1;
    }

    @Override
    public String toString() {        
        return "user id: " + id;
    }
}

推荐阅读