System.in के साथ कोशिश-के-संसाधनों का उपयोग करना [डुप्लिकेट]
तो मेरी आईडीई शिकायत कर रही है यदि मैं ब्लॉक के साथ कोशिश में स्कैनर को संलग्न नहीं करता हूं, लेकिन अगर मैं इसे बंद करने के बजाय इसे इस तरह से करता हूं जब इसे बंद करना चाहिए (एक बार जीत = सच), तो यह 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);
}
जवाब
मैं Scanner
एक ही इनपुट स्ट्रीम के आसपास कई ऑब्जेक्ट्स को लपेटने की सलाह दूंगा। (इस मामले में, System.in
) इसका कारण यह है क्योंकि स्कैनर्स अंतर्निहित स्ट्रीम से डेटा का उपभोग और बफर कर सकते हैं। इसका मतलब है कि कुछ मामलों में डेटा खो सकता है। आप इस प्रश्न में इसके बारे में अधिक पढ़ सकते हैं ।
आप इसे अपने साथ यहां ले जाने में सक्षम हो सकते हैं, जिस स्थिति में आपको कोशिश करने वाले संसाधनों में लपेटकर नहीं बस स्कैनर ऑब्जेक्ट को बंद करना चाहिए। उस स्थिति में, आप के साथ चेतावनी को दबा सकते हैं @SuppressWarnings("resource")
। हालांकि, यह बुरा अभ्यास है।
इसके बजाय, मैं एक एकल वैश्विक Scanner
ऑब्जेक्ट बनाने की सलाह दूंगा System.in
, जो चारों ओर से लपेटता है , और फिर इनपुट के लिए आवश्यक प्रत्येक विधि में एक नया स्कैनर बनाने के बजाय एक पैरामीटर के रूप में इस पद्धति को पास करना होगा।
मैं इसे कैसे रोकूं?
Scanner
ऑब्जेक्ट को बंद न करें , यानी Scanner
कि रैपिंग पर कोशिश-के-संसाधनों का उपयोग न करें System.in
।
इसके बजाय, चेतावनी को स्वीकार करें और इसे छिपाएं, क्योंकि यह सामान्य "संसाधन" नियमों का एक विशेष अपवाद है:
@SuppressWarnings("resource")
Scanner keyboard = new Scanner(System.in);
FYI करें: मैं ग्रहण आईडीई का उपयोग कर रहा हूं, और यह "कोशिश-के-संसाधनों के साथ घिरा" चेतावनी को ठीक करने के लिए केवल पहला विकल्प है:
