当前位置: 首页 > 知识库问答 >
问题:

Scanner.close方法关闭所有扫描仪为什么?[重复]

逑衡
2023-03-14

在我的代码中,我打开了两个扫描器方法,但关闭一个扫描器将关闭所有扫描器`

class x{
    public static void main(String args[]){
        Scanner s = new Scanner(System.in);
        void print(){
        Scanner xd = new Scanner (System.in);
         xd.close()
     }
}

`这里是xd。关闭我的扫描仪也是为什么?它如何克服这一点?朋友们,我想知道为什么?。还有没有其他方法可以暂时关闭扫描仪以防止内存泄漏?

共有2个答案

龙德义
2023-03-14
匿名用户

因为扫描仪。关闭将关闭系统。在中,隐式地:

如果此扫描仪尚未关闭,则如果其底层readable也实现了Closeable接口,则将调用readable的close方法。

时才俊
2023-03-14

为什么?因为这就是规范所说的它应该如何表现的;请参阅@Sun的答案,了解规范中的参考和文本。

它如何克服这一点?

不要在包装系统的扫描仪中调用close()。在中。这只是一般原则的一个应用,即资源应该由打开它的代码关闭。(JVM将在中打开系统,因此不应关闭它。)

或者,如果您必须关闭Scanner,则编写或查找一个InputStream包装类,该类忽略关闭()方法,然后使用该方法包装System.in

顺便说一下,多次实例化新扫描仪(System.in)是个坏主意。问题是,扫描仪可能提前读取任何或所有类型。如果有两个或两个以上的扫描器包装相同的底层流,则一个扫描器可以捕获后续扫描器需要读取的输入。这可能会导致偶尔的意外行为,如果标准输入被重定向,可能会导致应用程序失败。。。在外壳级别。

 类似资料:
  • < b >想改进这个问题?更新问题,以便通过编辑此帖子用事实和引用来回答问题。 我知道使用nextInt()方法不会消耗新行字符,所以为了处理这个问题,我需要使用一个空的nextLine()方法继续。 我的问题是,作为一种替代解决方案,程序是否会对任何类型的运行时错误开放以使用两个扫描仪,一个用于字符串输入,一个用于整数? 感谢您的任何帮助! (经过编辑,因此问题不那么主观)

  • 我有一行代码 我使用输入来获得一些用户输入。 我的程序警告我有资源泄漏,因为输入从未关闭。 一旦我加了一行 它停止抱怨,一切正常。 我是新来的Java,想知道关闭输入的目的是什么?它做什么。

  • 问题内容: 我试图将我的应用程序中较大且经常使用的部分重构为单独的方法,以使其易于维护。 其中一些方法要求用户输入并进行输入验证,因此我使用了Scanner和System.in,但是当我关闭Scanner时,我也关闭了System.in。 所以我的问题是,我只能通过用CloseShieldInputStream屏蔽System.in来防止System.in关闭,还是应该开始将Scanner传递给方

  • 我试图将应用程序中大量且经常使用的部分重新划分为不同的方法,以使其更容易维护。 其中一些方法要求用户输入并进行输入验证,因此我使用了扫描仪和系统。但当我关闭扫描仪时,我也会关闭系统。在里面 所以我的问题是,我只能阻止系统。通过使用CloseShieldInputStream屏蔽它来关闭,还是我应该开始向方法传递一个扫描器?

  • 问题内容: 在一个类中,我有两种使用扫描器类的不同方法。我为第一个方法创建了一个扫描程序对象的新实例,然后在第一个方法的结尾将其关闭…然后在第二个方法中创建了一个对象(具有不同名称)的新实例,最后在此方法的结尾。 除非我打开扫描仪一次,然后关闭扫描仪,否则它将无法工作并返回错误。扫描器类的双重用途似乎不起作用。我究竟做错了什么? 这是我的两种返回错误的方法… 问题答案: 您应该将Scanner声明

  • 位于java.util.scanner.throwfor(未知源)位于java.util.scanner.next(未知源)的线程“main”java.util.NoSuchelementException中出现异常**** 我多次调用s(扫描器),在第二次调用时出现运行时错误。这是由于关闭扫描仪,并可能再次使用它。我的问题是,每次使用Scanner时,我都会创建一个新的Scanner实例,那么为