compareTo () генерирует исключение нулевого указателя - PullRequest
2 голосов
/ 12 февраля 2020

Для моего назначения AP CSA я должен взять имя и затем идентификатор, оба из которых являются строками. Затем они хотят, чтобы я отсортировал значения, используя 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

Ответы [ 2 ]

1 голос
/ 12 февраля 2020

В конструкторе TeamMember вы не присвоили никакое значение переменной idString, когда findspace имеет значение 'False'. И так как ваше сравнение работает над idString, оно дает вам «нулевое значение». Возможно, вам просто нужно обновить код следующим образом:

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 голосов
/ 12 февраля 2020

Ошибка в классе 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);
    }

}
...