System.in के साथ कोशिश-के-संसाधनों का उपयोग करना [डुप्लिकेट]

Dec 12 2020

तो मेरी आईडीई शिकायत कर रही है यदि मैं ब्लॉक के साथ कोशिश में स्कैनर को संलग्न नहीं करता हूं, लेकिन अगर मैं इसे बंद करने के बजाय इसे इस तरह से करता हूं जब इसे बंद करना चाहिए (एक बार जीत = सच), तो यह 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);
}

जवाब

a.deshpande012 Dec 12 2020 at 03:19

मैं Scannerएक ही इनपुट स्ट्रीम के आसपास कई ऑब्जेक्ट्स को लपेटने की सलाह दूंगा। (इस मामले में, System.in) इसका कारण यह है क्योंकि स्कैनर्स अंतर्निहित स्ट्रीम से डेटा का उपभोग और बफर कर सकते हैं। इसका मतलब है कि कुछ मामलों में डेटा खो सकता है। आप इस प्रश्न में इसके बारे में अधिक पढ़ सकते हैं ।

आप इसे अपने साथ यहां ले जाने में सक्षम हो सकते हैं, जिस स्थिति में आपको कोशिश करने वाले संसाधनों में लपेटकर नहीं बस स्कैनर ऑब्जेक्ट को बंद करना चाहिए। उस स्थिति में, आप के साथ चेतावनी को दबा सकते हैं @SuppressWarnings("resource")। हालांकि, यह बुरा अभ्यास है।

इसके बजाय, मैं एक एकल वैश्विक Scannerऑब्जेक्ट बनाने की सलाह दूंगा System.in, जो चारों ओर से लपेटता है , और फिर इनपुट के लिए आवश्यक प्रत्येक विधि में एक नया स्कैनर बनाने के बजाय एक पैरामीटर के रूप में इस पद्धति को पास करना होगा।

Andreas Dec 12 2020 at 03:16

मैं इसे कैसे रोकूं?

Scannerऑब्जेक्ट को बंद न करें , यानी Scannerकि रैपिंग पर कोशिश-के-संसाधनों का उपयोग न करें System.in

इसके बजाय, चेतावनी को स्वीकार करें और इसे छिपाएं, क्योंकि यह सामान्य "संसाधन" नियमों का एक विशेष अपवाद है:

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

FYI करें: मैं ग्रहण आईडीई का उपयोग कर रहा हूं, और यह "कोशिश-के-संसाधनों के साथ घिरा" चेतावनी को ठीक करने के लिए केवल पहला विकल्प है: