我对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();
}
起初我认为最好在捕获了播放器的移动后关闭扫描器,然后在另一次调用该函数时再次打开它(参见input.close()注释)。 问题是,如果我关闭扫描仪,我有一个运行时错误说扫描仪是空的,并且如果由hasNextInt()驱动,则将nextInt()放在一个没有帮助的地方。 那么,输入扫描仪没有关闭是不对的(我只有资源泄漏的警告)?
提前谢谢。
答案 0 :(得分:4)
您无需关闭扫描仪。它是标准输入的包装器,JVM将在程序终止时为您关闭stdin。
静态代码分析仅检测到您有一些您没有关闭的东西,所以它会抱怨。它没有注意扫描仪包装的东西。
文件,网络套接字和jdbc对象之类的东西需要关闭。 stdin,stdout和stderr由jvm为你处理,byteArray流没有什么需要关闭。但Java使用装饰器模式来包装流,静态分析工具无法区分。
答案 1 :(得分:3)
我从来没有听说过任何关于你应该在不期待输入的情况下关闭扫描仪的事情,只是你应该在你的程序完成后关闭它们(理论上,Java无论如何都会关闭它)。我非常怀疑打开一个扫描仪会导致任何资源泄漏。
答案 2 :(得分:1)
完成使用后,只能关闭扫描仪。如果您没有显式关闭扫描程序,垃圾收集器将终止它并在程序终止后将其从内存中删除。