如果我不关闭扫描仪怎么办?

har*_*rym 4 java

我对Java的扫描仪有疑问。我正在编写井字游戏程序,每次玩家移动时都会调用此函数。

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();
}
Run Code Online (Sandbox Code Playgroud)

起初,我认为最好是在捕获到玩家的动作后关闭扫描仪,然后在再次调用该函数时再次打开它(请参见input.close()注释)。问题是,如果我关闭扫描仪,则会遇到运行时错误,指出扫描仪为空,而将nextInt()放入由hasNextInt()驱动的if中则无济于事。那么,不关闭输入扫描器是否是错误的(我只有资源泄漏的警告)?

先感谢您。

Nat*_*hes 5

您不必关闭扫描仪。它是标准输入的包装,当程序终止时,JVM将为您关闭stdin。

静态代码分析仅检测到您有未关闭的可关闭对象,因此它抱怨。它没有注意扫描仪包装的东西。

文件,网络套接字和jdbc对象之类的东西都需要关闭。jvm会帮您处理stdin,stdout和stderr,byteArray流没有什么需要关闭的。但是Java使用装饰器模式包装流,并且静态分析工具没有区别。