今天,在对服务器/客户端应用程序进行编程时,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*/
}
这样做时,我丢失了内存泄漏警告。
为什么让扫描仪作为班级成员解决了警告?是因为类的析构函数吗?
通常,当创建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")
或添加注释。