合并排序java.lang.StackOverflowError

黄豆

我正在为一个学校项目工作,在我尝试对自己的进行合并排序之前,一切进展顺利ArrayList
它会运行,但随后会出错。许多的第一个错误是Exception in thread "main" java.lang.StackOverflowError我查看了代码,无法找出错误发生的原因。它确实给了我一个位置(line 74:first_half = mergeSort(first_half);),但我没有看到此问题。

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;
}

}
赛义夫

我认为代码没有错误。
怎么确定?

我在您的环境中运行了您的代码,并执行了该代码,没有任何错误。

使用文本文件,我在https://www.cs.uoregon.edu/Classes/15F/cis212/assignments/phonebook.txt中找到了该文件作为输入并完成了一个简单的实现PhonebookEntry

那为什么是这个错误呢?

首先,所有尝试理解该错误的方法,我的意思是为什么StackOverflowError会发生。由于有很多我将不解释,但是请阅读这两个主题的最高答案,我相信您会知道为什么会发生这种情况。

线程1:什么是StackOverflowError?
线程2:究竟是什么导致堆栈溢出错误?

如果您阅读了这些书,希望您能理解摘要You Ran Out Of Memory

那为什么我没有得到这个错误:可能的原因是

在我的环境中,我将jvm配置为在1024m至1556m的更高内存下运行(作为eclipse参数)

现在,让我们用解决方案来分析您的案例:

  1. 输入:您在这里有大量输入(50,000)

    要检查您的代码,请尝试缩短输入并进行测试。

  2. 您已经在此大输入上的sigle方法中执行了两种算法:当一种方法执行时,所有变量都保留在内存中,直到完成执行为止。因此,当您调用合并排序时,所有以前的用户变量和其他变量都会留在内存中,这可能会导致这种情况

    现在,如果您使用分离的方法并从主方法中调用它们(例如编写选择排序方法),则选择排序结束后,其所有使用的变量将超出范围,并且可能是空闲的(如果GC收集了它们)。

    因此,编写了两种分开的方法来读取输入文件和选择排序。 close()那些FileReaderBufferedReader

  3. 摆脱那些静态的方法。使它们成为非静态的类的创建对象和对象,然后从main方法调用它们

因此,所有这些都与代码优化有关

而且,您也可以java -Xmx1556m -Xms1024m在命令行中破坏应用程序时像这样进行操作从而增加jvm的内存并进行测试

顺便说一句,感谢您提出这个问题,它给了我一些思考

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

合并排序抛出StackOverflowError

来自分类Dev

错误:java.lang.StackOverflowError

来自分类Dev

Google Firebase导致java.lang.StackOverflowError

来自分类Dev

休眠OneToMany java.lang.StackOverflowError

来自分类Dev

使用Xamarin完成Java.Lang.StackOverflowError

来自分类Dev

Spring + Hibernate java.lang.StackOverflowError

来自分类Dev

Scala括号java.lang.StackOverflowError

来自分类Dev

捕获:java.lang.StackOverflowError JsonBuilder关闭

来自分类Dev

Scala括号java.lang.StackOverflowError

来自分类Dev

使用Xamarin完成Java.Lang.StackOverflowError

来自分类Dev

捕获:java.lang.StackOverflowError JsonBuilder关闭

来自分类Dev

线程main中的java.lang.StackOverflowError

来自分类Dev

如何避免 java.lang.StackOverflowError?

来自分类Dev

Netsuite 脚本 2.0 java.lang.StackOverflowError

来自分类Dev

scala.MatchError:java.lang.StackOverflowError(类java.lang.StackOverflowError的)

来自分类Dev

奇数球衣错误:java.lang.StackOverflowError

来自分类Dev

线程“主”中的异常java.lang.StackOverflowError

来自分类Dev

Lombok.hashCode问题与“ java.lang.StackOverflowError:空”

来自分类Dev

为什么Scala尝试不捕获java.lang.StackOverflowError?

来自分类Dev

在线程“主”中获取异常java.lang.StackOverflowError

来自分类Dev

调用方法时出现java.lang.StackOverflowError

来自分类Dev

递归-线程“主”中的异常java.lang.StackOverflowError

来自分类Dev

龙目岛 - java.lang.StackOverflowError的:在toString方法无效

来自分类Dev

线程“主”中的异常java.lang.StackOverflowError问题

来自分类Dev

调用方法时出现java.lang.StackOverflowError

来自分类Dev

java.lang.StackOverflowError:堆栈大小8MB

来自分类Dev

使用子报表时Jasperreport 6.2 java.lang.StackOverflowError

来自分类Dev

使用emailext插件时出现java.lang.StackOverflowError

来自分类Dev

尝试删除实体时出现 java.lang.StackOverflowError

Related 相关文章

  1. 1

    合并排序抛出StackOverflowError

  2. 2

    错误:java.lang.StackOverflowError

  3. 3

    Google Firebase导致java.lang.StackOverflowError

  4. 4

    休眠OneToMany java.lang.StackOverflowError

  5. 5

    使用Xamarin完成Java.Lang.StackOverflowError

  6. 6

    Spring + Hibernate java.lang.StackOverflowError

  7. 7

    Scala括号java.lang.StackOverflowError

  8. 8

    捕获:java.lang.StackOverflowError JsonBuilder关闭

  9. 9

    Scala括号java.lang.StackOverflowError

  10. 10

    使用Xamarin完成Java.Lang.StackOverflowError

  11. 11

    捕获:java.lang.StackOverflowError JsonBuilder关闭

  12. 12

    线程main中的java.lang.StackOverflowError

  13. 13

    如何避免 java.lang.StackOverflowError?

  14. 14

    Netsuite 脚本 2.0 java.lang.StackOverflowError

  15. 15

    scala.MatchError:java.lang.StackOverflowError(类java.lang.StackOverflowError的)

  16. 16

    奇数球衣错误:java.lang.StackOverflowError

  17. 17

    线程“主”中的异常java.lang.StackOverflowError

  18. 18

    Lombok.hashCode问题与“ java.lang.StackOverflowError:空”

  19. 19

    为什么Scala尝试不捕获java.lang.StackOverflowError?

  20. 20

    在线程“主”中获取异常java.lang.StackOverflowError

  21. 21

    调用方法时出现java.lang.StackOverflowError

  22. 22

    递归-线程“主”中的异常java.lang.StackOverflowError

  23. 23

    龙目岛 - java.lang.StackOverflowError的:在toString方法无效

  24. 24

    线程“主”中的异常java.lang.StackOverflowError问题

  25. 25

    调用方法时出现java.lang.StackOverflowError

  26. 26

    java.lang.StackOverflowError:堆栈大小8MB

  27. 27

    使用子报表时Jasperreport 6.2 java.lang.StackOverflowError

  28. 28

    使用emailext插件时出现java.lang.StackOverflowError

  29. 29

    尝试删除实体时出现 java.lang.StackOverflowError

热门标签

归档