有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

preferenceChanged方法中的Java/Swing堆栈溢出

我目前正在从事一个Java项目,遇到了堆栈溢出错误的问题。首先,程序读入一个约1500000字的文件,并将其添加到数组中。然后它读入一个大约600字的小文件,并将其添加到一个数组中。它检查600字文件中有多少字出现在另一个文件中。大文件中的每个单词都与一个数字相关联。因此,当它在大文件中找到一个单词时,它会获取该单词及其关联整数的副本,并将其添加到数组中。我的问题是我遇到了堆栈溢出错误:

"AWT-EventQueue-0" java.lang.StackOverflowError

问题是,当这个小文件大约有200个字时,程序运行良好。 程序必须执行的最后一行是:

result.setPage("file:file for gui NEW.html");

(其中结果是一个窗格)

出于某种原因,当小文件为600字时,我会出现stackoverflow错误,但当文件为200字时,运行正常。它运行最后一行并生成此文件,但不会将其打印到编辑器窗格,因为此时会出现异常

有人能告诉我为什么会发生这种情况,以及我如何着手解决它吗? 谢谢


控制台中的完整错误是:

Exception in thread "AWT-EventQueue-0" java.lang.StackOverflowError
    at sun.awt.SunToolkit.getSystemEventQueueImplPP(Unknown Source)
    at sun.awt.SunToolkit.getSystemEventQueueImpl(Unknown Source)
    at java.awt.Toolkit.getEventQueue(Unknown Source)
    at java.awt.EventQueue.isDispatchThread(Unknown Source)
    at javax.swing.SwingUtilities.isEventDispatchThread(Unknown Source)
    at javax.swing.JComponent.revalidate(Unknown Source)
    at javax.swing.plaf.basic.
             BasicTextUI$RootView.preferenceChanged(Unknown Source)
    at javax.swing.text.View.preferenceChanged(Unknown Source)
    at javax.swing.text.BoxView.preferenceChanged(Unknown Source)
    at javax.swing.text.View.preferenceChanged(Unknown Source)
    at javax.swing.text.BoxView.preferenceChanged(Unknown Source)
    at javax.swing.text.View.preferenceChanged(Unknown Source)
    at javax.swing.text.BoxView.preferenceChanged(Unknown Source)
    (... repeating forever ...)

EDIT:因此基本上,GUI中的两个控件似乎一直在调用对方的preferenceChanged()方法


Gui似乎是最有可能的原因,因为当我在没有Gui的情况下运行程序并将文件内容打印到控制台时,它工作正常。我不知道到底是什么导致了这个问题。我没有使用改变偏好的例行程序。只有像setSize()、setVisible()之类的东西会导致它吗


共 (6) 个答案

  1. # 1 楼答案

    我认为你遇到了这个问题的一个变体:

    http://www.jdocs.com/harmony/5.M5/javax/swing/text/BoxView.html#M-layout(int,int)

    protected void layout ( int width, int height )

    This method may cause stack overflow if upon each layout try a child changes its preferences, i.e. preferenceChanged is called.

    我不确定你是如何做到这一点的,但尽量不要改变孩子们对布局的偏好。我相信,比我更有swing经验的人可以提供一个更有价值的答案

  2. # 2 楼答案

    假设您可以附加一个调试器,那么在Eclipse上(抱歉,我不知道Netbeans/Idea),您可以为StackOverflowerr添加一个异常断点。在断点视图的工具栏中,有一个按钮,它有一个带感叹号的蓝色J——“J!”-单击此项,然后输入StackOverflowError并选择仅在未捕获异常时挂起

    也许这将提供更多的背景来说明哪里出了问题

  3. # 3 楼答案

    堆栈溢出在GUI对象的preferenceChanged()例程中。罪魁祸首是你的GUI正在做的事情,你的数组使用只是触发因素

    您是否对任何GUI对象进行了子类化,尤其是在任何地方使用您自己的preferenceChanged()函数的GUI对象?最好的猜测是,它与显示滚动条有关,因为异常取决于要添加到此数组中的对象数量。仔细检查文档,查看您正在使用的任何GUI对象或事件

  4. # 4 楼答案

    看看StackOverflowerr的stacktrace。它几乎肯定会向您展示一个或两个反复调用自身/彼此的方法。重写这些方法,使其不会发生(或不会经常发生)

  5. # 6 楼答案

    我会检查正在输出的文件,因为递归似乎发生在JEditorPane中,而不是在您的代码中——这个文件会显示在普通的web浏览器中吗?请记住,绝地魔方不是世界上最先进的组件,如果你想展示一些复杂的东西,它可能会窒息

    我在JEditor窗格中也遇到过布局错误,这些错误似乎是随机发生的,我从来没有找到它的底部,尽管这通常是在我编辑窗格内容而不是仅仅显示网页时发生的

    如果在加载文件时更改窗口大小,可能会导致您描述的各种错误,我会尝试将文件加载到编辑器窗格中,而不进行更改