I am working on a project for school and things are going well until i tried to perform a merge sort on my ArrayList.
It will run but then it errors out. The first error of many is Exception in thread "main" java.lang.StackOverflowError. 
I have looked over the code and cant find out why the error is occurring.
It does give me a location ( line 74:first_half = mergeSort(first_half); ) but i don't see the issue.
public static void main(String[] args) throws IOException {
    // URL url = new
    // URL("https://www.cs.uoregon.edu/Classes/15F/cis212/assignments/phonebook.txt");
    FileReader fileReader = new FileReader("TestSort.txt");
    BufferedReader bufferReader = new BufferedReader(fileReader);
    String entry = bufferReader.readLine();
    // Scanner s = new Scanner(url.openStream());
//      int count = 0;
    while (entry != null) {
        // String person = s.nextLine();
        String phoneNum = entry.substring(0, 7);
        String name = entry.substring(9);
        PhonebookEntry newentry = new PhonebookEntry(name, phoneNum);
        phoneBook.add(newentry);
        entry = bufferReader.readLine();
    }
    // ********************Selection
    // Sort*************************************
    ArrayList<PhonebookEntry> sortList = new ArrayList<PhonebookEntry>(phoneBook);
    for (int min = 0; min < sortList.size(); min++) {
        for (int i = min; i < sortList.size(); i++) {
            int res = sortList.get(min).getName().compareTo(sortList.get(i).getName());
            if (res > 0) {
                PhonebookEntry temp = sortList.get(i);
                sortList.set(i, sortList.get(min));
                sortList.set(min, temp);
            }
        }
    }
    for (PhonebookEntry sortentry : sortList) {
        System.out.println(sortentry);
    }
    System.out.println(mergeSort(mergeSortList));
}
// *****************************merge sort******************************************
static int mergecounter = 0;
static ArrayList<PhonebookEntry> mergeSortList = new ArrayList<PhonebookEntry>(appMain.phoneBook);
public static ArrayList<PhonebookEntry> mergeSort(ArrayList<PhonebookEntry> mergeSortLists) {
    if (mergeSortLists.size() == 1) {
        return mergeSortLists;
    }
    int firstHalf = mergeSortLists.size() % 2 == 0 ? mergeSortLists.size() / 2 : mergeSortLists.size() / 2 + 1;
    ArrayList<PhonebookEntry> first_half = new ArrayList<PhonebookEntry>(mergeSortLists.subList(0, firstHalf));
    ArrayList<PhonebookEntry> mergeSortHalf2 = new ArrayList<PhonebookEntry>(
    mergeSortLists.subList(first_half.size(), mergeSortLists.size()));
    System.out.println(++mergecounter);
    first_half = mergeSort(first_half);
    mergeSortHalf2 = mergeSort(mergeSortHalf2);
    return merge(first_half, mergeSortHalf2);
}
public static ArrayList<PhonebookEntry> merge(ArrayList<PhonebookEntry> first_half,
        ArrayList<PhonebookEntry> mergeSortHalf2) {
    ArrayList<PhonebookEntry> returnMerge = new ArrayList<PhonebookEntry>();
    while (first_half.size() > 0 && mergeSortHalf2.size() > 0) {
        if (first_half.get(0).getName().compareTo(mergeSortHalf2.get(0).getName()) > 0) {
            returnMerge.add(mergeSortHalf2.get(0));
            mergeSortHalf2.remove(0);
        }
        else {
            returnMerge.add(first_half.get(0));
            first_half.remove(first_half.get(0));
        }
    }
    while (first_half.size() > 0) {
        returnMerge.add(first_half.get(0));
        first_half.remove(first_half.get(0));
    }
    while (mergeSortHalf2.size() > 0) {
        returnMerge.add(mergeSortHalf2.get(0));
        mergeSortHalf2.remove(mergeSortHalf2.get(0));
    }
    return returnMerge;
}
}
 
     
    