将 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 对象,然后将其作为参数传递给此方法,而不是在每个方法中创建一个新的扫描器需要输入。