我想创建一个类并将其用作数据类型,以使用数组创建MergeSort程序。我创建了程序,但它给了我空指针异常,我不知道为什么。
员工类
public class Employee implements Comparable<Employee>
{
private String firstname;
private int idNumber;
private String lastname;
Employee(String fname, String lname, int id)
{
firstname = fname;
idNumber = id;
lastname = lname;
}
public void setFirstName(String fname)
{firstname = fname;}
public String getFirstName()
{return firstname;}
public void setidNumber(int id)
{idNumber = id;}
public int getidNumber()
{return idNumber;}
public void setLastName(String lname)
{lastname = lname;}
public String getLastName()
{return lastname;}
public String toString()
{
String str = "\nName: " + firstname + " " + lastname
+ "\nID: " + idNumber;
return str;
}
public int compareTo(Employee Employee2)
{
int nameDiff = lastname.compareToIgnoreCase(Employee2.lastname);
if(nameDiff != 0)
return nameDiff;
return -1;
}
}
数组类
class Array
{
public Employee[] A;
public int nElems;
public Array(int max)
{
A = new Employee[max];
nElems = 0;
}
public void insert(Employee value)
{
int j;
for(j = 0; j < nElems; j++)
if(A[j].equals(value))
break;
for(int k = nElems; k > j; k--)
A[k] = A[k-1];
A[j] = value;
nElems++;
}
public void display()
{
for(int j = 0; j < nElems; j++)
System.out.print(A[j] + " ");
System.out.println(" ");
}
public static void merge(Employee[] L, Employee[] R, Employee[] A)
{
int nL = L.length;
int nR = R.length;
int i = 0;
int j = 0;
int k = 0;
while(i < nL && j < nR)
{
if(L[i].compareTo(R[j]) <= 0)
{
A[k] = L[i];
k++;
i++;
}
else
{
A[k] = R[j];
k++;
j++;
}
}
while(i < nL)
{
A[k] = L[i];
k++;
i++;
}
while (j < nR)
{
A[k] = R[j];
k++;
j++;
}
}
private static void _mergeSort(Employee[] A)
{
int n = A.length;
int i , j, mid;
if(n < 2) return;
mid = n/2;
Employee[] left = new Employee[mid];
Employee[] right = new Employee[n - mid];
for(i = 0; i < mid; i++)
left[i] = A[i];
for(i = mid; i < n-mid; i++)
right[i-mid] = A[i];
_mergeSort(left);
_mergeSort(right);
merge(left, right, A);
}
public void mergeSort()
{
_mergeSort(A);
}
}
驱动程序类
class MergeSortDriver
{
public static void main (String [] args)
{
Employee s1 = new Employee("Bob","Sullivan",52);
Employee s2 = new Employee("Maggie", "Smith",98);
Employee s3 = new Employee("John", "Ocasio", 85);
Employee s4 = new Employee("Christina", "Yang", 46);
Array arr = new Array(50);
Employee A[] = {s1,s2,s3,s4};
arr.insert(s1);
arr.insert(s2);
arr.insert(s3);
arr.insert(s4);
arr.display();
arr.mergeSort();
arr.display();
}
}
错误Mesg
----jGRASP exec: java MergeSortDriver
Name: Bob Sullivan
ID: 52
Name: Maggie Smith
ID: 98
Name: John Ocasio
ID: 85
Name: Christina Yang
ID: 46
Exception in thread "main" java.lang.NullPointerException
at Employee.compareTo(Employee.java:37)
at Array.merge(Array.java:40)
at Array._mergeSort(Array.java:83)
at Array._mergeSort(Array.java:82)
at Array._mergeSort(Array.java:81)
at Array._mergeSort(Array.java:81)
at Array._mergeSort(Array.java:81)
at Array._mergeSort(Array.java:81)
at Array.mergeSort(Array.java:88)
at MergeSortDriver.main(Array.java:112)
----jGRASP wedge2: exit code for process is 1.
----jGRASP: operation complete.
答案 0 :(得分:0)
您的NullPointerException
发生在Employee#compareTo
函数中 - 请务必仔细阅读您的堆栈跟踪。
这可能是这一行:
int nameDiff = lastname.compareToIgnoreCase(Employee2.lastname);
如果Employee2为null,那么这将失败,因为null没有名为lastname的字段。
好的,那叫什么?在您的合并方法中,您执行以下操作:
if(L[i].compareTo(R[j]) <= 0)
你是绝对的,100%肯定R[j] != null
?您的代码不会检查。检查一下。因为如果R[j] == null
那么这个NullPointerException
完全有道理,对吧?
此外,没有冒犯,但这看起来像计算机科学的功课给我。确保下次发布您已经尝试过的内容,以及您的思考过程。通过仔细阅读堆栈跟踪可以很好地解决这个问题。
答案 1 :(得分:0)
首先,要么只创建一个大小为4的数组(或者您实际要使用的任何大小),要么将数组拆分为具有有效值的数组(非空)。
然后,在您的第二个for循环中,您将阵列分成左侧和右侧,循环的条件为i < n - mid
,但是因为您从i = mid
开始,所以#39;使数组足够大。
将其更改为此,您将不再获得例外:
for(i = mid; i < n; i++)
right[i-mid] = A[i];