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

问题描述 投票:0回答:1

今天,在对服务器/客户端应用程序进行编程时,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*/

}

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

为什么让扫描仪作为班级成员解决了警告?是因为类的析构函数吗?

java multithreading oop java.util.scanner
1个回答
0
投票

通常,当创建Scanner时,一旦不再需要它就需要Scanner

close类具有多个重载的构造函数,其中每个构造函数都采用不同类型的参数。有一个带有Scanner参数的构造函数。有一个带有File参数的构造函数。并且有一个带有File参数的构造函数。为了使您的Java程序能够通过计算机键盘接受来自用户的输入,您可以使用采用Path的构造函数,如下所示:

Path

这是因为类InputStream的静态成员InputStream具有类型InputStream。您应该将Scanner scanner = new Scanner(System.in); 视为将键盘封装在计算机上。如果您关闭in,就像关闭键盘,那是您不应该做的。

现在in IDE不够智能,无法意识到您的代码正在创建一个java.lang.System,该InputStream本质上封装了计算机键盘(因此不应关闭)。 Eclipse仅知道您最终创建的任何System.in都应关闭,并且由于您的代码没有关闭您创建的System.in,因此Eclipse显示警告,提示您尚未关闭Eclipse ]创建。在显示的警告中,为您提供有关如何消除警告的三个建议。前两个是您可以添加的注释,即

Scanner

第三条建议要求您更改Eclipse配置。通过选择出现在Eclipse IDE顶部的Window菜单的Preferences项目来执行此操作。在Preferenes窗口中,选择Java>编译器> Errors / Warnings,然后将Resource loss设置更改为Ignore,如以下屏幕截图所示:

Scanner

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

个人,我只是忽略了警告,因为我知道我不应该关闭用Scanner创建的@SuppressWarnings("resource") 或添加注释。

© www.soinside.com 2019 - 2024. All rights reserved.