在执行MergeSort方法时出现空指针异常

时间:2014-04-09 17:52:04

标签: java merge mergesort

我想创建一个类并将其用作数据类型,以使用数组创建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.

2 个答案:

答案 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];