2013-03-13 7 views
5

जब भी मैं इसे चलाता हूं, chooseCave() फ़ंक्शन in.nextInt() के साथ ठीक काम करता है। जब मैं गुफा चुनते हैं, संदेशों 2-सेकंड के अंतराल पर पॉप अप, और फिर जैसे ही यह वह हिस्सा अतीत हो जाता है, यह मेरे त्रुटि देता है:धागे "मुख्य" java.util में अपवाद। NoSuchElementException

Exception in thread "main" java.util.NoSuchElementException: No line found 
    at java.util.Scanner.nextLine(Unknown Source) 
    at Dragon.main(Dragon.java:81) 

मैं hasNextLine() और hasNextInt() की कोशिश की है, और जब मैं main विधि में while hasNextLine() का उपयोग करें, मुझे एक और अधिक त्रुटियां मिलती हैं। जब मैं chooseCave() विधि में while hasNextInt() का उपयोग करता हूं, तो यह मेरे इनपुट को स्वीकार नहीं करता है।

जब मैं chooseCave() विधि में if hasNextInt() उपयोग करें, यह playAgain स्ट्रिंग के लिए अपने इनपुट hasNextInt() बूलियन रिटर्न false स्वीकार नहीं करता है, और सीधे एक और खेल में चला जाता है, लेकिन फिर और यह स्पैम करता "किस गुफा ..." असीम ।

मैं त्रुटियों की रिपोर्ट और जावा-डॉक्स और स्टैक ओवरफ़्लो के माध्यम से इसी तरह की समस्याओं के साथ चला गया हूं। कृपया मदद करे।

import java.util.Scanner; 
public class Dragon { 

public static void displayIntro() { 
    System.out.println("You are in a land full of dragons. In front of you, "); 
    System.out.println("You see two caves. In one cave, the dragon is friendly"); 
    System.out.println("and will share his treasure with you. The other dragon"); 
    System.out.println("is greedy and hungry, and will eat you on sight"); 
    System.out.println(' '); 
} 

public static int chooseCave() { 
    Scanner in = new Scanner(System.in); 
    int cave = 0; 
    while (cave != 1 && cave != 2) { 
     System.out.println("Which cave will you go into? (1 or 2)"); 

     cave = in.nextInt(); 

    } 
    in.close(); 
    return cave; 
} 

public static void checkCave(int chosenCave) { 
    System.out.println("You approach the cave..."); 
    try 
     { 
     // Sleep at least n milliseconds. 
     // 1 millisecond = 1/1000 of a second. 
     Thread.sleep(2000); 
     } 
    catch (InterruptedException e) 
     { 
     System.out.println("awakened prematurely"); 
     } 
    System.out.println("It is dark and spooky..."); 
    try 
     { 
     // Sleep at least n milliseconds. 
     // 1 millisecond = 1/1000 of a second. 
     Thread.sleep(2000); 
     } 
    catch (InterruptedException e) 
     { 
     System.out.println("awakened prematurely"); 
     } 
    System.out.println("A large dragon jumps out in front of you! He opens his jaws and..."); 
    try 
     { 
     // Sleep at least n milliseconds. 
     // 1 millisecond = 1/1000 of a second. 
     Thread.sleep(2000); 
     } 
    catch (InterruptedException e) 
     { 
     System.out.println("awakened prematurely"); 
     } 

    double friendlyCave = Math.ceil(Math.random() * 2); 

    if (chosenCave == friendlyCave) { 
     System.out.println("Gives you his treasure!"); 
    } 
    else { 
     System.out.println("Gobbles you down in one bite!"); 
    } 



} 
public static void main(String[] args) { 
    Scanner inner = new Scanner(System.in); 
    String playAgain = "yes"; 
    boolean play = true; 
    while (play) { 
     displayIntro(); 
     int caveNumber = chooseCave(); 
     checkCave(caveNumber); 
     System.out.println("Do you want to play again? (yes or no)"); 
     playAgain = inner.nextLine(); 
     if (playAgain == "yes") { 
      play = true; 
     } 
     else { 
      play = false; 
     } 
    } 
    inner.close(); 

} 

} 

उत्तर

8

आप दूसरे Scanner जो अंतर्निहित InputStream बंद कर देता है बंद करते हैं, इसलिए पहले Scanner नहीं रह गया है एक ही InputStream और एक NoSuchElementException परिणामों से पढ़ सकते हैं।

समाधान: कंसोल ऐप्स के लिए, System.in से पढ़ने के लिए एक Scanner का उपयोग करें।

इसके अलावा: जैसा कि पहले से कहा गया है, ध्यान रखें कि Scanner#nextInt न्यूलाइन वर्णों का उपभोग नहीं करता है। सुनिश्चित करें कि का उपयोग करके nextLine पर कॉल करने का प्रयास करने से पहले इन्हें उपभोग किया जाता है।

देखें: Do not create multiple buffered wrappers on a single InputStream

+0

+1, मैं एक इनपुट समस्या के साथ एकाधिक स्कैनर का उल्लेख करना भूल गया। – syb0rg

+0

आपके लिए धन्यवाद और syb0rg। मुझे बस स्कैनर के साथ विधि को हटाना पड़ा और समकक्ष को मुख्य विधि में रखना पड़ा। यह काम करता हैं! एक नई प्रोग्रामिंग भाषा में पहली सफलता ... वास्तव में अच्छा लगता है। :) –

5

nextInt() विधि \n (अंत लाइन) प्रतीक छोड़ देता है और nextLine() द्वारा तुरंत उठाया जाता है, अगले इनपुट से अधिक लंघन। - नहीं है अपने "अगला" तरीकों मिश्रण

String nextIntString = keyboard.nextLine(); //get the number as a single line 
int nextInt = Integer.parseInt(nextIntString); //convert the string to an int 

यह अभी तक का सबसे आसान तरीका कर रहा है समस्याओं से बचने के: क्या आप क्या करना चाहते सब कुछ के लिए nextLine() का उपयोग करें, और इसे बाद में पार्स है। केवल nextLine() का उपयोग करें और फिर int एस या बाद में अलग शब्दों का विश्लेषण करें।


इसके अलावा, आप केवल एक ही Scanner का उपयोग करता है, तो अपने ही इनपुट के लिए एक टर्मिनल का उपयोग कर रहे सुनिश्चित करें। अपवाद के लिए यह एक और कारण हो सकता है।


अंतिम ध्यान दें: .equals() समारोह, नहीं == ऑपरेटर के साथ एक String की तुलना करें।

if (playAgain == "yes"); // Causes problems 
if (playAgain.equals("yes")); // Works every time 
+0

धन्यवाद! काश मैं यहाँ आपको ऊपर उठाने के लिए पर्याप्त अंक था। मैंने जो कहा है, मैंने तय किया है, और यह अभी भी काम नहीं कर रहा है ... लेकिन अच्छी खबर यह है कि, जब मैंने विधि से स्कैनर लिया, तो मैं इसे सभी को मुख्य विधि में डाल पाया और यह ठीक काम किया। प्रारंभिक संख्या के साथ भी मदद की। एक बार फिर धन्यवाद! :) –

1

Reimeus सही है, तो आप इस वजह से in.close अपने chooseCave() में देखते हैं। इसके अलावा, यह गलत है।

if (playAgain == "yes") { 
     play = true; 
} 

आपको "==" के बजाय बराबर का उपयोग करना चाहिए।

if (playAgain.equals("yes")) { 
     play = true; 
} 
+0

सहमत हैं, लेकिन त्रुटि का कारण नहीं है। हालांकि बाद में समस्याओं का कारण हो सकता है ... – syb0rg

0

बस बंद नहीं में

अपने कोड से in.close() निकालूँ।

+0

यह स्वीकार्य उत्तर डुप्लिकेट करता है, लेकिन बहुत कम गुणवत्ता पर। – JasonMArcher

+0

मुझे भी एक ही समस्या का सामना करना पड़ रहा था .. इंटरनेट पर बहुत कुछ खोजने के बाद और अंततः मेरे कोड से .close() को हटाने के लिए मेरे लिए काम किया। यही कारण है कि मैंने इसका उत्तर दिया है। –

+0

यह उत्तर वास्तव में पहले से ही दिया गया था, और एक बेहतर स्पष्टीकरण के साथ। –

-1

मुझे एक ही त्रुटि मिली और इनमें से कोई भी समाधान काम नहीं किया। अपने पीसी पर स्थापित जावा के संस्करण की जांच करने का प्रयास करें।

यह जावा 1.8 पर मेरे लिए काम किया।

संबंधित मुद्दे