compareTo()抛出空指针异常

问题描述 投票:0回答:2

对于我的AP CSA分配,我必须先输入一个名称,然后输入一个ID,这两个都是字符串。然后他们希望我使用compareTo()对值进行排序。问题是,当我尝试使用compareTo()时,它总是抛出空指针异常。第一个值始终为null(使用System.out.println()找到它以查看正在比较的值),但我无法找出为什么它为null。

这是我的主班:

import java.util.Scanner;
import java.util.ArrayList;

public class Main {

  public static void main(String[] args){
    Scanner scan = new Scanner(System.in);

    ArrayList<TeamMember> members = new ArrayList<TeamMember>();
    String name = "";

    while(true)
    {
      System.out.println("Enter the next name:");
      name = scan.nextLine();

      if(name.toUpperCase().equals("STOP"))
      {
        break; 
      }

      System.out.println("Enter the next ID:");
      String id = scan.nextLine();

      members.add(new TeamMember(name,id));
    }

    for(int i = 0; i < members.size() - 1; i++)
    {
      System.out.println(members);
      TeamMember temp = members.get(i);
      for(int j = i + 1; j < members.size(); j++)
      {
        System.out.println(members.get(i) + " " + members.get(j));
        if(members.get(i).compareTo(members.get(j)) < 0)
        {
          members.add(i, members.remove(j));
          members.set(j, temp);
        }
      }
    }

  }

}

这是我的TeamMember班:

public class  TeamMember implements Comparable<TeamMember>{
  String fullName;
  String idString;

  public TeamMember(String name, String id){
    name = name.toUpperCase();
    boolean findspace = false;

    for(int i = 0; i < name.length(); i++)
    {
      if (name.charAt(i) == ' ')
      {
        findspace = true;
        break;
      }
    }

    if(findspace)
    {
      String string1 = name.substring(0, 1) + name.substring(1, findSpace(name)).toLowerCase();

      String string2 = name.substring(findSpace(name) + 1, findSpace(name) + 2) + name.substring(findSpace(name) + 2).toLowerCase();

      fullName = string1+ " " + string2;
      idString = id;
    } 
    else 
    {
      fullName = name.charAt(0) + name.substring(1).toLowerCase();
    }

  }

  private int findSpace(String name){
    for(int j = 0; j < name.length(); j++){
      if (name.charAt(j) == ' '){
        return j;
      }
    }
    return 0;
  }


  public String toString(){
    return fullName;
  }

  @Override
  public int compareTo(TeamMember other){
    return this.idString.compareTo(other.idString);
  }


}

我知道我的排序可能是错误的,但是我无法进行测试,因为compareTo()使我感到困惑。

这是他们希望我们尝试的测试用例:

Enter the next name:
zeb
Enter the next ID:
02-003
Enter the next name:
rita stevens
Enter the next ID:
01-001
Enter the next name:
SUE wOOds
Enter the next ID:
02-001
Enter the next name:
adele
Enter the next ID:
01-002
Enter the next name:
BarBara
Enter the next ID:
02-002
Enter the next name:
STOP
java nullpointerexception
2个回答
0
投票

TeamMember构造函数中,当idString的值为'False'时,您没有为findspace变量分配任何值。并且由于您的比较适用于idString,因此它为您提供了“ nullpointerexception”。您可能只需要按以下方式更新代码:

if(findspace)
    {
      String string1 = name.substring(0, 1) + name.substring(1, findSpace(name)).toLowerCase();

      String string2 = name.substring(findSpace(name) + 1, findSpace(name) + 2) + name.substring(findSpace(name) + 2).toLowerCase();

      fullName = string1+ " " + string2;
      //idString = id;   // Moving this assignment outside if-block
    } 
    else 
    {
      fullName = name.charAt(0) + name.substring(1).toLowerCase();
    }
    idString = id;

0
投票

该错误在TeamMember类中。您需要移动“ idString = id;”超出“ if(findspace){...}”块。这是“ TeamMember”类的固定代码:

public class TeamMember implements Comparable<TeamMember> {
    String fullName;
    String idString;

    public TeamMember(String name, String id) {
        name = name.toUpperCase();
        idString = id;
        boolean findspace = false;
        for (int i = 0; i < name.length(); i++) {
            if (name.charAt(i) == ' ') {
                findspace = true;
                break;
            }
        }

        if (findspace) {
            String string1 = name.substring(0, 1) + name.substring(1, findSpace(name)).toLowerCase();

            String string2 = name.substring(findSpace(name) + 1, findSpace(name) + 2)
                    + name.substring(findSpace(name) + 2).toLowerCase();

            fullName = string1 + " " + string2;

        } else {
            fullName = name.charAt(0) + name.substring(1).toLowerCase();
        }

    }

    private int findSpace(String name) {
        for (int j = 0; j < name.length(); j++) {
            if (name.charAt(j) == ' ') {
                return j;
            }
        }
        return 0;
    }

    public String toString() {
        return fullName;
    }

    @Override
    public int compareTo(TeamMember other) {
        return this.idString.compareTo(other.idString);
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.