gpt4 book ai didi

java - 扫描仪对象具有类属性,而不是在代码初始化中

转载 作者:行者123 更新时间:2023-12-01 16:29:25 31 4
gpt4 key购买 nike

今天,我在编写服务器/客户端应用程序时遇到了 Scanner 对象的问题。我已经解决了问题,但我不明白为什么我的解决方案解决了问题。

首先,在我的应用程序中,我在编译项目时出现了一些内存泄漏警告(JAVA 8,eclipse) 因为我使用 Scanner 询问用户输入但没有关闭它。当我尝试关闭扫描仪时,我的其他类抛出异常,如 java.util.NoSuchElementException 。我了解到我遇到了类似的问题:Cannot use multiple Scanner objects in Java但在课间。当我关闭一个类中的扫描仪时,另一个类(线程)扫描仪无法执行。 (java.util.NoSuchElementException)

我发现解决这个问题的解决方案是将 Scanner 函数作为类函数成员:

public class ClientThread extends Thread {

private Scanner scanner;

/*some code*/

}

这样做时,我丢失了内存泄漏警告。

为什么让扫描仪作为类(class)成员解决了这个警告?是因为类析构函数吗?

最佳答案

通常,当您创建Scanner时,您需要close一旦您不再需要它,就可以使用它。

Scanner 类有几个重载的构造函数,其中每个构造函数都采用不同类型的参数。有一个构造函数采用 File争论。有一个构造函数采用 Path争论。还有一个构造函数需要 InputStream争论。为了让您的 Java 程序通过计算机键盘接受用户的输入,您可以使用采用 InputStream 的构造函数,如下所示:

Scanner scanner = new Scanner(System.in);

这是因为静态成员in java.lang.System 类的类型为 InputStream。您应该将 System.in 视为封装计算机上的键盘。如果您关闭 System.in,就像关闭键盘一样,这是您不应该做的事情。

现在是Eclipse IDE 不够智能,无法意识到您的代码正在创建一个本质上封装了计算机键盘的 Scanner(因此不应关闭)。 Eclipse 只知道您创建的任何 Scanner 最终应该关闭,并且由于您的代码不会关闭您创建的 ScannerEclipse 显示一条警告,提示您尚未关闭您创建的扫描仪。在显示的警告中,您将获得有关如何消除警告的三个建议。前两个指的是您可以添加的注释,即

@SuppressWarnings("resource")

第三个建议要求您更改 Eclipse 配置。您可以通过选择出现在 Eclipse IDE 顶部的 Window 菜单中的 Preferences 项来完成此操作。在“Preferenes”窗口中,选择“Java”>“编译器”>“错误/警告”,并将“资源泄漏”设置更改为“忽略”,如以下屏幕截图所示:

Eclipse preferences window

但请注意,此配置设置适用于所有资源,而不仅仅是Scanner,因此,如果您在 Java 代码中打开常规文件并且不关闭它,Eclipse 不会警告您。

就我个人而言,我只是忽略该警告,因为我知道我不应该关闭使用 System.in 创建的 Scanner 或添加注释。

关于java - 扫描仪对象具有类属性,而不是在代码初始化中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62079582/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com