这个问题在这里已经有答案了:
关闭扫描仪而不关闭system.in(3个答案)
28天前关门了。
所以我的ide抱怨说如果我不把扫描仪放在一个try-with块中,但是如果我这样做而不是在应该关闭的时候关闭它(一旦win=true),它就会关闭系统。在流中,我该如何防止呢?
public final void turn() {
System.out.println("Enter your next move!");
try (Scanner keyboard = new Scanner(System.in)) {
final String move = keyboard.nextLine();
if (move.isEmpty()) {
won = true;
return;
}
if (!validateFormat(move)) {
System.out.println("Invalid format, try again.");
return;
}
String[] moveAr;
try {
moveAr = move.split(",");
} catch (PatternSyntaxException e) {
System.out.println(e.getMessage());
return;
}
try {
validFields(moveAr);
} catch (InvalidTurnException e) {
System.out.println(e.getMessage());
return;
}
final char colour = spielFeld.getField(getColumn(moveAr[0].charAt(0)),Character.getNumericValue(moveAr[0].charAt(1)) - 1).getColour();
for (final String string : moveAr) {
final int line = Character.getNumericValue(string.charAt(1)) - 1;
final int column = getColumn(string.charAt(0));
spielFeld.cross(column,line);
final int columni = getColumn(string.charAt(0));
if (spielFeld.columnCrossed(columni)) {
points += crossedValues(string.charAt(0));
}
}
if (spielFeld.colourComplete(colour)) {
points += COLOUR_POINTS;
coloursCrossed++;
}
if (coloursCrossed >= 2) {
won = true;
}
}
System.out.println("Momentane Punkte: " + points);
}
2条答案
按热度按时间5hcedyr01#
我建议不要有多个
Scanner
围绕同一输入流的对象(在这种情况下,System.in
)这是因为扫描器可能会消耗和缓冲来自底层流的数据。这意味着在某些情况下数据可能会丢失。你可以在这个问题中了解更多。在这里,您可能可以侥幸逃脱,在这种情况下,您不应该通过不使用try with resources Package scanner对象来关闭它。在这种情况下,可以使用
@SuppressWarnings("resource")
. 然而,这是不好的做法。相反,我建议创建一个
Scanner
环绕的物体System.in
,然后将其作为参数传递给此方法,而不是在每个需要输入的方法中创建新的扫描程序。pgky5nke2#
我该怎么防止呢?
不要关Windows
Scanner
对象,即不要对资源使用tryScanner
那是 PackageSystem.in
.相反,接受警告并将其隐藏,因为这是正常“资源”规则的特殊例外:
仅供参考:我使用的是eclipse ide,它“使用try with resources”只是修复警告的第一个选项: