Menggunakan try-with-resources dengan System.in [duplikat]

Dec 12 2020

Jadi IDE saya mengeluh jika saya tidak menyertakan Pemindai dalam percobaan dengan blok, tetapi jika saya melakukannya dengan cara ini alih-alih menutupnya ketika seharusnya ditutup (sekali menang = benar), itu menutup aliran System.in, bagaimana cara mencegahnya?

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);
}

Jawaban

a.deshpande012 Dec 12 2020 at 03:19

Saya akan merekomendasikan agar tidak memiliki banyak Scannerobjek yang membungkus di sekitar aliran input yang sama. (dalam hal ini, System.in) Alasannya adalah karena Pemindai dapat menggunakan dan menyangga data dari aliran yang mendasarinya. Artinya, dalam beberapa kasus, data bisa hilang. Anda dapat membaca lebih lanjut tentang itu di pertanyaan ini .

Anda mungkin bisa lolos begitu saja di sini, dalam hal ini Anda sebaiknya tidak menutup objek Scanner dengan tidak menggabungkannya dalam try-with-resources. Jika demikian, Anda dapat menekan peringatan dengan @SuppressWarnings("resource"). Namun, ini adalah praktik yang buruk.

Sebagai gantinya, saya akan merekomendasikan membuat satu Scannerobjek global yang membungkus System.in, dan kemudian meneruskannya ke metode ini sebagai parameter daripada membuat pemindai baru di setiap metode yang membutuhkan input.

Andreas Dec 12 2020 at 03:16

bagaimana cara mencegahnya?

Jangan menutup Scannerobjek, yaitu jangan gunakan try-with-resources pada Scanneryang membungkus System.in.

Sebaliknya, terima peringatan dan sembunyikan, karena ini pengecualian khusus untuk aturan "resource" normal:

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

FYI: Saya menggunakan Eclipse IDE, dan "Surround with try-with-resources" hanyalah opsi pertama untuk memperbaiki peringatan: