[英]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.