因此,由于这里有一些反馈,我花了一些时间研究util.Scanner。在How to use java.util.Scanner to correctly...
上的这篇文章中找到了最令我印象深刻的声明您可能永远不会真正看到Scanner在专业/商业业务应用程序中使用,因为它所做的一切都可以通过其他方式更好地完成。现实世界中的软件必须比Scanner允许您编写代码更具弹性和可维护性。现实世界的软件使用标准化的文件格式解析器和文档化的文件格式,而不是单独分配给您的即席输入格式。
因此,我查找了一些其他选项来获取用户输入,并决定使用BufferedReader。我要完成的工作是让用户告诉程序他们是否要继续玩游戏,让程序重复问题直到给出有效输入(Y / N),并让程序执行根据答案继续或终止。
三个相关问题:
BufferedReader比Scanner更好吗?
是否有一个更好地解决此任务的选项?是的,那是什么?
如果答案不符合标准,让方法本身调用以创建“循环”是否合适?
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class RageGame {
public static void main(String[] args) throws IOException {
char playAgain = 'Y';
// Loop game until user decides they are done.
do {
playAgain = playRage();
} while (playAgain == 'Y');
//Quit message
System.out.println("Thanks for playing Rage!");
}
public static char playRage() throws IOException {
return playAgain();
}
public static char playAgain() throws IOException{
char answer;
BufferedReader kb = new BufferedReader(new InputStreamReader(System.in));
//Ask the user if they want to continue and set their response to upper case.
System.out.println("Do you wish to play again? (y/n)");
answer = (char) Character.toUpperCase(kb.read());
//Check if answer fits criteria
if (answer != 'Y' && answer != 'N') {
System.out.println("Sorry, " + answer + " is not a valid answer.");
return playAgain();
}else {
return answer;
}
}
}
答案 0 :(得分:1)
简短的回答是:不要关闭它。
您的Scanner
正在使用流System.in
。 System.in
不是您的程序获取的资源(您没有打开流),因此您不应关闭它。其他人负责关闭该程序。
如果发现警告令人讨厌,则可以将其静音。
让我们假设您的扫描仪从文件而不是System.in
接收输入,那么您需要在上一次需要使用后调用close
:
answer = Character.toUpperCase(kb.next().charAt(0));
kb.close();
如果您担心忘记调用close
,只需使用try-with-resources
块,它将为您关闭!
try (Scanner kb = new Scanner(some other source)) {
System.out.println("Do you wish to play again? (y/n)");
answer = Character.toUpperCase(kb.next().charAt(0));
} // this will always close the scanner
答案 1 :(得分:-1)
另外,如果您想关闭扫描仪,则可以将System.in
包装在CloseShieldInputStream
内。您的扫描仪将使用代理流。如果您有兴趣,请看看http://commons.apache.org/proper/commons-io/apidocs/org/apache/commons/io/input/CloseShieldInputStream.html