我目前正在开发一个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字时运行正常。它运行最后一行并生成此文件,但不会将其打印到编辑器窗格,因为这是异常启动时的。
任何人都可以帮忙告诉我为什么会发生这种情况以及如何解决这个问题? 感谢。
控制台中的错误是:
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 ...)
编辑:所以基本上似乎GUI中的两个控件不断调用彼此的preferenceChanged()
方法。
Gui似乎是最可能的原因,因为当我在没有gui的情况下运行程序并将文件的内容打印到控制台时,它工作正常。我不知道究竟是什么导致了这个问题。我没有使用偏好改变的例程。只有像setSize(),setVisible()等这样的东西会导致它吗?
答案 0 :(得分:6)
你在某个地方有递归功能吗?这通常是堆栈溢出的来源。
答案 1 :(得分:4)
我认为您遇到了这个问题的变体:
http://www.jdocs.com/harmony/5.M5/javax/swing/text/BoxView.html#M-layout(int,int)
protected void layout ( int width, int height )
此方法可能导致堆栈溢出 如果在每个布局上尝试一个孩子 改变其偏好,即 preferenceChanged被调用。
我不确定你是如何实现这一目标但是尽量不要在布局上改变孩子们的预防措施。我确信那些比我更有经验的人可以提供更有价值的答案。
答案 2 :(得分:3)
堆栈溢出在GUI对象的preferenceChanged()例程中。罪魁祸首是你的GUI正在做的事情,你的阵列使用只是触发器。
您是否继承了任何GUI对象,尤其是具有您自己的preferenceChanged()函数的GUI对象?最好的猜测是它与显示滚动条有关,因为异常取决于您要添加到此数组的对象数量。对于您正在使用的任何GUI对象或事件,请仔细检查文档。
答案 3 :(得分:1)
查看StackOverflowError的堆栈跟踪。它几乎肯定会向你展示一两种方法,它们反复呼唤自己/彼此。重写这些方法,以免发生这种情况(或者不经常发生)。
答案 4 :(得分:1)
我会检查正在输出的文件,因为递归似乎发生在JEditorPane而不是代码中 - 这个文件是否显示在普通的Web浏览器中?请记住,JEditorPane不是世界上最先进的组件,如果你试图展示一些复杂的东西,它可能会窒息。
我也经历过JEditor Pane中的布局错误,这些错误似乎是随机发生的,我从来没有找到底部,尽管这通常是在我编辑窗格的内容而不仅仅是显示网页时。
如果您在加载文件时更改窗口大小,可能会导致您所描述的错误类型 - 我会尝试将文件加载到编辑器窗格中而不进行更改。
答案 5 :(得分:0)
假设您可以在Eclipse上附加调试器(抱歉,我不知道Netbeans / Idea),那么您可以为StackOverflowError添加一个异常断点。在断点视图的工具栏中,有一个按钮,其中有一个带有感叹号的蓝色J - “J!” - 单击此按钮,然后输入StackOverflowError并选择仅暂停未捕获的异常。
也许这会提供更多关于出错的背景。
答案 6 :(得分:0)
答案 7 :(得分:-1)
你应该检查递归 - 直接递归(当函数调用自己时)和间接递归(当A调用B和B再次调用A时)。
最简单的方法是附加调试器,并在堆栈溢出时查看调用堆栈。