2012-10-03 13 views
16

बनाता है इसलिए मैं एक प्रोग्राम तैयार कर रहा हूं जो उपयोगकर्ता इनपुट से इट्स लेता है। मेरे पास एक बहुत सीधी कोशिश/पकड़ ब्लॉक है जो, यदि उपयोगकर्ता int में प्रवेश नहीं करता है, तब तक ब्लॉक को दोहराना चाहिए जब तक कि वे ऐसा न करें। तो ट्राई/कैच वास्तव में क्या यह चाहिए था करता है और मुझे इसे फिर से में डाल बनाताइनपुटमैस्चैच अपवाद के साथ प्रयास/पकड़ें अनंत लूप

import java.util.InputMismatchException; 
import java.util.Scanner; 


public class Except { 
    public static void main(String[] args) { 
     Scanner input = new Scanner(System.in); 
     boolean bError = true; 
     int n1 = 0, n2 = 0, nQuotient = 0; 

     do { 
      try { 
       System.out.println("Enter first num: "); 
       n1 = input.nextInt(); 
       System.out.println("Enter second num: "); 
       n2 = input.nextInt(); 
       nQuotient = n1/n2; 
       bError = false; 
      } 
      catch (Exception e) { 
       System.out.println("Error!"); 
      } 
     } while (bError); 

     System.out.printf("%d/%d = %d",n1,n2, nQuotient); 
    } 
} 

अगर मैं दूसरे पूर्णांक के लिए एक 0 दर्ज,: यहाँ कोड के प्रासंगिक हिस्सा है। लेकिन, अगर मेरे पास एक इनपुटमिस्मैच अपवाद है, तो संख्याओं में से किसी एक के लिए 5.5 दर्ज करके, यह केवल मेरे त्रुटि संदेश को अनंत लूप में दिखाता है। यह क्यों हो रहा है, और मैं इसके बारे में क्या कर सकता हूं? (वैसे, मैं स्पष्ट रूप से तर्क को पकड़ने के लिए के रूप में InputMismatchException टाइपिंग की कोशिश की है, लेकिन यह समस्या ठीक नहीं होती।

उत्तर

24

आप next(); कॉल करने के लिए जब आप त्रुटि मिलती है की जरूरत है। इसके अलावा इसका इस्तेमाल करने की सलाह दी जाती है hasNextInt()

 catch (Exception e) { 
      System.out.println("Error!"); 
      input.next();// Move to next other wise exception 
     } 

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

Scanner scanner = new Scanner(System.in); 
    int n1 = 0, n2 = 0; 
    boolean bError = true; 
    while (bError) { 
     if (scanner.hasNextInt()) 
      n1 = scanner.nextInt(); 
     else { 
      scanner.next(); 
      continue; 
     } 
     if (scanner.hasNextInt()) 
      n2 = scanner.nextInt(); 
     else { 
      scanner.next(); 
      continue; 
     } 
     bError = false; 
    } 
    System.out.println(n1); 
    System.out.println(n2); 

जावाडोक की Scanner

जब कोई स्कैनर इनपुटमैस्चैच अपवाद को फेंकता है, तो स्कैनर उस टोकन को पास नहीं करेगा जो अपवाद का कारण बनता है, ताकि इसे किसी अन्य विधि के माध्यम से पुनर्प्राप्त या छोड़ा जा सके।

+1

यह वाकई बहुत अच्छा है, धन्यवाद! क्या आप थोड़ा और विस्तार से समझा सकते हैं कि आपको 'अगली() 'कमांड की आवश्यकता क्यों है? मेरे पास कुछ विचार है लेकिन यह मेरे लिए थोड़ा अस्पष्ट है। –

+0

@limp_chimp ने प्रश्न को अद्यतन किया। –

1

bError = false बयान के रूप में try block में तक पहुँच नहीं है, और बयान यह अनंत लूप में त्रुटि मुद्रण रहता है, इनपुट लिया करने के लिए मारा है।

hasNextInt()

catch (Exception e) { 
      System.out.println("Error!"); 
      input.hasNextInt();   
     } 

का उपयोग करके इसे इस तरह से उपयोग करने का प्रयास या nextLine() इनपुट लेने के लिए Integer.parseInt() के साथ मिलकर उपयोग करने का प्रयास ....

Scanner scan = new Scanner(System.in); 

int num1 = Integer.parseInt(scan.nextLine()); 
int num2 = Integer.parseInt(scan.nextLine()); 
1

AmitD जवाब पूरक करने के लिए:

बस अपने प्रोग्राम की प्रतिलिपि/चिपकाएं और यह आउटपुट था:

Error! 
Enter first num: 
.... infinite times .... 

आप देख सकते हैं, अनुदेश:

n1 = input.nextInt(); 

लगातार अपवाद फेंक है जब आपके डबल संख्या में प्रवेश किया, और कहा कि क्योंकि अपनी स्ट्रीम साफ नहीं है। इसे ठीक करने के लिए, अमित डी उत्तर का पालन करें।

1

@ लिंप, आपका उत्तर सही है, इनपुट पढ़ने के दौरान बस .nextLine() का उपयोग करें। नमूना कोड:

do { 
     try { 
      System.out.println("Enter first num: "); 
      n1 = Integer.parseInt(input.nextLine()); 
      System.out.println("Enter second num: "); 
      n2 = Integer.parseInt(input.nextLine()); 
      nQuotient = n1/n2; 
      bError = false; 
     } catch (Exception e) { 
      System.out.println("Error!"); 
     } 
    } while (bError); 

    System.out.printf("%d/%d = %d", n1, n2, nQuotient); 

विवरण को पढ़ें कि यह समस्या नीचे दिए गए लिंक में क्यों हुई थी। इस धागे में विस्तार के लिए पोस्ट किए गए उत्तर की तलाश करें। Java Homework user input issue

ठीक है, मैं संक्षेप में इसका वर्णन करूंगा। जब आप nextInt() का उपयोग करके इनपुट पढ़ते हैं, तो आप केवल संख्या भाग पढ़ते हैं लेकिन अंतराल वर्ण अभी भी स्ट्रीम पर था। यही मुख्य कारण था। अब उपरोक्त कोड को देखें, मैंने जो कुछ किया है वह पूरी रेखा पढ़ता है और इसे पार्स करता है, यह अभी भी अपवाद फेंकता है और जिस तरह से आप काम करने की उम्मीद कर रहे थे उस पर काम करते हैं। आपका बाकी कोड ठीक काम करता है।

2

आप निम्न

do { 
     try { 
      System.out.println("Enter first num: "); 
      n1 = Integer.parseInt(input.next()); 

      System.out.println("Enter second num: "); 
      n2 = Integer.parseInt(input.next()); 

      nQuotient = n1/n2; 

      bError = false; 
     } 
     catch (Exception e) { 
      System.out.println("Error!"); 
      input.reset(); 
     } 
    } while (bError); 
2

एक और विकल्प की कोशिश कर सकते स्कैनर इनपुट = नया स्कैनर (System.in) को परिभाषित करने के लिए है; कोशिश ब्लॉक के अंदर, यह प्रत्येक बार जब आप मानों को फिर से दर्ज करने की आवश्यकता होती है तो एक नई वस्तु बनायेगी।

2

का पालन करें debobroto दास का जवाब देने के आप भी मैं एक ही समस्या थी और जब मैं इस कोशिश की बाद

input.reset(); 
input.next(); 

डाल सकते हैं। यह पूरी तरह से इसे ठीक कर दिया।

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