【问题标题】:Java/Swing stack overflow in preferenceChanged methodpreferenceChanged 方法中的 Java/Swing 堆栈溢出
【发布时间】:2009-02-26 12:26:02
【问题描述】:

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

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

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

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

(其中结果是 JEditorPane)

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

谁能帮助告诉我为什么会发生这种情况以及我该如何解决它? 谢谢。


控制台中的完整错误是:

线程“AWT-EventQueue-0”中的异常 java.lang.StackOverflowError 在 sun.awt.SunToolkit.getSystemEventQueueImplPP(未知来源) 在 sun.awt.SunToolkit.getSystemEventQueueImpl(未知来源) 在 java.awt.Toolkit.getEventQueue(未知来源) 在 java.awt.EventQueue.isDispatchThread(未知来源) 在 javax.swing.SwingUtilities.isEventDispatchThread(未知来源) 在 javax.swing.JComponent.revalidate(未知来源) 在 javax.swing.plaf.basic。 BasicTextUI$RootView.preferenceChanged(未知来源) 在 javax.swing.text.View.preferenceChanged(未知来源) 在 javax.swing.text.BoxView.preferenceChanged(未知来源) 在 javax.swing.text.View.preferenceChanged(未知来源) 在 javax.swing.text.BoxView.preferenceChanged(未知来源) 在 javax.swing.text.View.preferenceChanged(未知来源) 在 javax.swing.text.BoxView.preferenceChanged(未知来源) (......永远重复......)

编辑:所以基本上看起来 GUI 中的两个控件一直在调用彼此的 preferenceChanged() 方法。


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

【问题讨论】:

    标签: java swing


    【解决方案1】:

    你在某处有递归函数吗?这通常是堆栈溢出的根源。

    Additional info here.

    【讨论】:

      【解决方案2】:

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

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

      protected void layout ( int width, int height )

      此方法可能会导致堆栈溢出 如果在每个布局上尝试一个孩子 改变它的偏好,即 调用了preferenceChanged。

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

      【讨论】:

      • 你能不能扩展一下。这似乎可以解决我的问题。
      • 特别篇:对不起,我已经有一段时间没有使用 Swing 了,我不想写不真实的东西。你应该问问有更多 Swing 经验的人。我会稍微修改一下你的问题,希望这会吸引有更多 Swing 知识的人的注意。
      【解决方案3】:

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

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

      【讨论】:

      • 嘿。这似乎是最可能的原因,因为当我在没有 gui 的情况下运行程序并将文件的内容打印到控制台时,它可以正常工作。我不知道究竟是什么导致了这个问题。我没有使用偏好更改例程。只有 setSize()、setVisible() 等。
      • 是时候调试你的 GUI 了。您是否对任何内容进行子类化和/或对 GUI 事件做出反应?
      • 我的 gui 正在运行一个类(它可以在没有 gui 的情况下处理一个大文件),然后它运行以下行: result.setPage("file:file for gui NEW.html");如果我在它之后放置任何打印语句,它会打印它们然后抛出异常。
      • 堆栈跟踪列出了事件队列,而不是主队列。这意味着当溢出发生时,正在异步处理 GUI 事件(setPage?)。也许您的 HTML 格式不正确。通过在必要时删除大部分程序来准确确定崩溃与不崩溃之间的区别。
      • 不同之处在于,如果我传入一个小文件(比如 300 个字),它会在我传递一个大文件(比如 800 个字)时运行并在编辑器窗格中正常显示,然后它会引发 stackoverflow 错误.
      【解决方案4】:

      查看 StackOverflowError 的堆栈跟踪。它几乎肯定会向您展示一种或两种重复调用自身/彼此的方法。重写这些方法,这样就不会发生(或不会经常发生)。

      【讨论】:

      • 如何检查堆栈跟踪是什么?
      • 堆栈跟踪是控制台上异常或错误本身下的所有行 - 它准确地告诉您问题发生的位置,对于 Java 中的任何调试都绝对至关重要
      • 堆栈跟踪打印在问题中。最后它开始重复最后 2 个。
      【解决方案5】:

      我会检查正在输出的文件,因为递归似乎发生在 JEditorPane 中,而不是在您的代码中 - 该文件是否显示在普通的 Web 浏览器中好吗?请记住,JEditorPane 不是世界上最先进的组件,如果您尝试显示复杂的内容,可能会窒息。

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

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

      【讨论】:

        【解决方案6】:

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

        也许这会提供更多关于出了什么问题的上下文。

        【讨论】:

          【解决方案7】:

          如果是递归问题,那么您可以尝试使用使用显式堆栈而不是隐式堆栈(如 BFSDFS)的新算法来更改算法

          【讨论】:

            【解决方案8】:

            您应该检查递归 - 直接递归(当函数调用自身时)和间接递归(当 A 调用 B 并且 B 再次调用 A 时)。

            执行此操作的最简单方法是附加调试器并在堆栈溢出时查看调用堆栈。

            【讨论】:

              猜你喜欢
              • 2020-07-13
              • 1970-01-01
              • 2017-08-26
              • 1970-01-01
              • 2019-05-18
              • 2016-03-12
              • 2013-02-19
              • 1970-01-01
              • 2011-09-10
              相关资源
              最近更新 更多