当前位置: 首页 > 面试题库 >

为什么您必须不得不dispose()一个超出范围的java.awt.Window?

徐茂材
2023-03-14
问题内容

我在应用程序中发现的内存泄漏之一是java.awt.Window.allWindows私有静态字段,该字段跟踪每个Window实例化。我们创建,使用并随后忘记了对话框,并且期望它们会消失并被垃圾回收。此私有字段将它们无限期地保持在范围内,直到dispose()对它们调用该方法为止。而且根据定义,当它们超出范围时,我们不能这样做。

我不明白为什么要这样设计。在完成Window对象处理后必须显式地让系统知道,这似乎与垃圾回收的精神背道而驰。显然,我已经完成了,因为它超出了范围。

我了解该dispose()方法在做什么:摆脱系统对等对象。我确实知道这是Java之外的东西,您需要某种方式来做到这一点,并且Swing不应仅仅跟踪这些对象,否则它将导致内存泄漏。但是Window,当我永远不再使用它时,永远保持对我的引用会实现什么?

有人可以解释为什么这是必要的吗?


问题答案:

我讨厌这么说,但这就是GUI的工作方式。

Windows是非阻塞的。这意味着一旦您在代码中创建一个,您的代码就会继续执行。

这意味着您的Window可能在创建后立即超出范围,除非您在其他位置显式存储了对该窗口的引用。此时,窗口仍在屏幕上。

这也意味着完成后需要其他一些方法来摆脱它。输入Window dispose()方法,可以从Window的一个侦听器中调用该方法。



 类似资料:
  • 问题内容: 我对代码块或“作用域”的定义感到困惑。苹果公司的守卫文档说了这一点:守卫声明的else块… “必须转移控制权以退出其中出现保护声明的代码块。” 其他在线消息来源说,警卫声明必须退出其存在的“范围”。 因此,请看下面的示例代码: 根据我目前对“范围”的理解,代码 创建一个新范围,即{}之间。鉴于此假设,后卫只会逃避这一范围。但事实并非如此。在这种情况下,无论是否将其埋在if子句中,gua

  • 问题内容: 在Java中,我使用的是方法,但不确定为什么它不会引发“索引不足”错误。 字符串的索引从0到4开头,但是基于我可以调用foo.substring(0)并获取“ abcde”的事实,该方法将startIndex和endIndex作为参数。 那么为什么substring(5)起作用?该索引应超出范围。有什么解释? 此代码输出: 当我用6替换5时: 然后我得到错误: 问题答案: 根据Java

  • 问题内容: 我编写了这段代码,将整个以10为底的数字转换为二进制。我相信代码就是它所需要的一切,但是我无法让ArrayLists正常工作。我已经在这个网站上花了几个小时,而其他人则尝试了无数次更改,但无济于事。我已经获得了可以在没有和错误的情况下进行编译的代码,但是一旦输入int程序就会崩溃。 这是代码: 这些是我输入数字时Java抛出的异常。 我希望这是足够的信息。 问题答案: 在您的代码中,您

  • 我正在阅读Al Sweigart的书《自动化无聊的东西》,我对我遇到的索引错误感到不知所措。我正在使用PyPDF2尝试打开一个加密的PDF文档。我知道这本书是2015年的,所以我去了文档,看看我是否遗漏了什么,一切似乎都一样,至少据我所知。所以我不确定这里出了什么问题。 给予: 在问我的问题之前,我在谷歌上搜索了一下,找到了这个带有“建议修复”的链接。然而,我对这一点很陌生,想看看解决方法是什么。

  • 问题内容: 为什么字典键必须是不可变的?我正在寻找一个简单明了的原因,为什么Python字典中的键具有该限制。 问题答案: 在我的计算机上,有一个包含大量英语单词的文件: 让我们创建一个字典来存储所有这些单词的长度: 并且,为了踢球,我们将改组原始单词列表: 嗯,滚刀。无论如何…现在我们已经有点混乱了,我们变得有点偏执了(可能出于与渴望滚刀相同的原因),并且我们想检查字典中的所有单词是否都正确。我

  • 问题内容: 编译网格视图以显示一组订单时,出现索引超出范围异常。 当我添加新行时,它不会发生,但是当我尝试删除或更新行时,它会发生。 任何帮助深表感谢。 设计者是: 后面的代码是: 后面的页面代码是: 问题答案: 您没有为Grid设置数据键的名称,但是您的删除方法引用了DataKeys [e.RowIndex]。我认为这就是引发异常的地方。 在标记中设置DataKeyNames =“ OrderI