如果我不关闭Scanner会发生什么?

4

我有一个关于Java的Scanner的问题。 我正在编写一个井字棋程序,每当玩家应该进行移动时都会调用此函数。

public void mossa(){
    int riga, colonna;
    int errore;
    Scanner input = new Scanner(System.in);
    if(player=='O')
        System.out.println("GIOCATORE O\n");
    else
        System.out.println("GIOCATORE X\n");

    do{
        errore = 0;
        System.out.println("Riga: ");
        riga = input.nextInt();

        System.out.println("Colonna: ");
        colonna = input.nextInt();

        if(board[riga][colonna]!=' '){
            errore=1;
            System.out.println("Hai scelto una casella gia occupata!\n");
        }
        if(riga>3 || colonna>3 || riga<0 ||colonna<0){
            errore=1;
            System.out.println("Hai scelto una casella che non esiste!\n");
        }

    }while(errore==1);

    //----->input.close();<------


    if(player == 'X')
        board[riga][colonna] = 'X';
    else
        board[riga][colonna] = 'O';

    togglePlayer();
}

起初我认为在捕获玩家的移动后关闭Scanner,然后在再次调用函数时重新打开它会更好(请参见注释的input.close())。问题是,如果我关闭Scanner,就会出现运行时错误,提示Scanner为空,并且将nextInt()放在由hasNextInt()驱动的if中也无济于事。所以,不关闭输入Scanner是否有错(我只有资源泄漏的警告)?
提前感谢您。

你在哪里关闭了Scanner? - sp00m
我在代码中注释了这行,它在do-while循环之后。 - harrym
1
使用 try-with-resources 语句,Java 将为您关闭 Scanner - Florent Bayle
3个回答

5

你不需要关闭Scanner。它是标准输入的包装器,当程序终止时,JVM会负责关闭stdin。

静态代码分析仅检测到您有未关闭的可关闭项,因此会发出警告。它没有关注Scanner包装的内容。

像文件、网络套接字和jdbc对象这样的东西需要关闭。stdin、stdout和stderr由jvm为您处理,byteArray流没有需要关闭的内容。但Java使用装饰器模式来包装流,静态分析工具无法区分。


谢谢!程序可以运行,但是Eclipse会给我一个警告,所以我还是选择问一下 :) - harrym

3

我从未听说过任何东西说您应该在不期望输入时关闭扫描器,只是当您的程序完成时,您应该关闭它们(理论上,Java会为您关闭它们)。我非常怀疑只开启一个扫描器会导致任何资源泄漏。


谢谢!由于我正在从C语言转向Java,也许我会想:“我需要像在C语言中编程时一样使用free()函数!” :) - harrym

1

仅在使用完扫描器后关闭它。如果您不明确关闭扫描器,最终垃圾收集器将在程序终止后销毁并从内存中删除它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接