在system.in中使用try with resources

4ioopgfo  于 2021-06-30  发布在  Java
关注(0)|答案(2)|浏览(321)

这个问题在这里已经有答案了

关闭扫描仪而不关闭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);
}
5hcedyr0

5hcedyr01#

我建议不要有多个 Scanner 围绕同一输入流的对象(在这种情况下, System.in )这是因为扫描器可能会消耗和缓冲来自底层流的数据。这意味着在某些情况下数据可能会丢失。你可以在这个问题中了解更多。
在这里,您可能可以侥幸逃脱,在这种情况下,您不应该通过不使用try with resources Package scanner对象来关闭它。在这种情况下,可以使用 @SuppressWarnings("resource") . 然而,这是不好的做法。
相反,我建议创建一个 Scanner 环绕的物体 System.in ,然后将其作为参数传递给此方法,而不是在每个需要输入的方法中创建新的扫描程序。

pgky5nke

pgky5nke2#

我该怎么防止呢?
不要关Windows Scanner 对象,即不要对资源使用try Scanner 那是 Package System.in .
相反,接受警告并将其隐藏,因为这是正常“资源”规则的特殊例外:

@SuppressWarnings("resource")
Scanner keyboard = new Scanner(System.in);

仅供参考:我使用的是eclipse ide,它“使用try with resources”只是修复警告的第一个选项:

相关问题