将 try-with-resources 与 System.in 一起使用
Using try-with-resources with System.in
所以我的 IDE 抱怨如果我没有将扫描仪包含在 try with 块中,但是如果我这样做而不是在它应该关闭时关闭它(一旦 win = true) ,它会关闭 System.in 流,我该如何防止这种情况发生?
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);
}
how do I prevent that?
不要关闭 Scanner
对象,即不要在包装 System.in
.
的 Scanner
上使用 try-with-resources
相反,接受警告并隐藏它,因为它是正常“资源”规则的特殊例外:
@SuppressWarnings("resource")
Scanner keyboard = new Scanner(System.in);
仅供参考: 我正在使用 Eclipse IDE,它的“Surround with try-with-resources”只是修复警告的第一个选项:
我建议不要让多个 Scanner
对象环绕同一个输入流。 (在这种情况下,System.in
)这是因为扫描器可能会消耗和缓冲来自底层流的数据。这意味着在某些情况下数据可能会丢失。您可以阅读更多相关信息 in this question。
您可能可以在这里摆脱它,在这种情况下,您不应该通过不将其包装在 try-with-resources 中来关闭 Scanner 对象。在这种情况下,您可以使用 @SuppressWarnings("resource")
抑制警告。但是,这是不好的做法。
相反,我建议创建一个环绕 System.in
的全局 Scanner
对象,然后将其作为参数传递给此方法,而不是在每个方法中创建一个新的扫描器需要输入。
所以我的 IDE 抱怨如果我没有将扫描仪包含在 try with 块中,但是如果我这样做而不是在它应该关闭时关闭它(一旦 win = true) ,它会关闭 System.in 流,我该如何防止这种情况发生?
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);
}
how do I prevent that?
不要关闭 Scanner
对象,即不要在包装 System.in
.
Scanner
上使用 try-with-resources
相反,接受警告并隐藏它,因为它是正常“资源”规则的特殊例外:
@SuppressWarnings("resource")
Scanner keyboard = new Scanner(System.in);
仅供参考: 我正在使用 Eclipse IDE,它的“Surround with try-with-resources”只是修复警告的第一个选项:
我建议不要让多个 Scanner
对象环绕同一个输入流。 (在这种情况下,System.in
)这是因为扫描器可能会消耗和缓冲来自底层流的数据。这意味着在某些情况下数据可能会丢失。您可以阅读更多相关信息 in this question。
您可能可以在这里摆脱它,在这种情况下,您不应该通过不将其包装在 try-with-resources 中来关闭 Scanner 对象。在这种情况下,您可以使用 @SuppressWarnings("resource")
抑制警告。但是,这是不好的做法。
相反,我建议创建一个环绕 System.in
的全局 Scanner
对象,然后将其作为参数传递给此方法,而不是在每个方法中创建一个新的扫描器需要输入。