簡體   English   中英

compareTo() 拋出空指針異常

[英]compareTo() throws null pointer exception

對於我的 AP CSA 作業,我必須取一個名字,然后取一個 id,這兩個都是字符串。 然后他們希望我使用 compareTo() 對值進行排序。 問題是當我嘗試使用 compareTo() 時,它總是拋出空指針異常。 第一個值始終為空(使用 System.out.println() 找到它以查看正在比較的值),但我不知道為什么它為空。

這是我的主課:

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

TeamMember構造函數中,當findspace值為“False”時,您沒有為idString變量分配任何值。 由於您的比較是針對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;

該錯誤位於 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);
    }

}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM