2012-10-07 11 views
5

मैं इस पर घंटों तक घूर रहा हूं और समाधान के बारे में सोचने में असमर्थ हूं; मैं आमतौर पर regex के साथ इस प्रकार की मान्यता संभाल लेकिन एक बदलाव के लिए निर्मित एक समाधान का उपयोग करने की कोशिश कर रहा हूँ (जाहिर है, मैं अक्सर ऐसा नहीं करते हैं):जावा कोशिश/पकड़ - या तो "वापसी नहीं मिली" या "चर प्रारंभ नहीं किया गया है"?

private static double promptUserDecimal(){ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a decimal"); 
    try{ 
     double input2 = Double.parseDouble(scan.nextLine()); 
     return input2; 
    } catch(NumberFormatException e){ 
     System.out.println("Sorry, you provided an invalid option, please try again."); 
    } 
} 

इस के साथ त्रुटि है कि "वापसी "कंपाइलर द्वारा नहीं मिला है इसलिए मुझे एक संकलन त्रुटि मिलती है। अगर मैं कोशिश/पकड़ के बाहर "वापसी" डालता हूं तो मुझे "इनपुट 2" घोषित करने/आरंभ करने की आवश्यकता होती है जो ऑपरेशन के उद्देश्य को हरा देता है। किसी भी सहायता की सराहना की जाती है ...

+1

आप अपवाद को पकड़ते हैं, एक संदेश प्रिंट करते हैं, लेकिन फिर भी विधि 'पकड़' ब्लॉक से जारी है। कंपाइलर इस तथ्य के बारे में शिकायत कर रहा है कि अगर कैच ब्लॉक मारा जाता है तो आप वापस नहीं आते हैं (सभी नहीं पथ वापसी) – birryree

उत्तर

0

आप वापसी या (या पकड़ के बाद) से कुछ फेंक की जरूरत है। उपयोगकर्ता को आपके आउटपुट के आधार पर, ऐसा लगता है कि आप एक ही चीज़ फिर से करना चाहते हैं। बस विधि को फिर से कॉल करें और परिणाम वापस करें।

private static double promptUserDecimal(){ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a decimal"); 
    try{ 
     double input2 = Double.parseDouble(scan.nextLine()); 
     return input2; 
    } catch(NumberFormatException e){ 
     System.out.println("Sorry, you provided an invalid option, please try again."); 
     return promptUserDecimal(); 
    } 
} 
+0

"पुनः प्रयास करें" के लिए रिकर्सन का उपयोग करना अल है अजीब चिल्लाओ; यह प्रत्येक बार ढेर पर अधिक लंबित कॉल का निर्माण करेगा। यद्यपि उपयोगकर्ता को स्टैक ओवरफ़्लो के कारण पर्याप्त बार खराब इनपुट दर्ज करने की संभावना नहीं है, लेकिन एक लूप अधिक समझ में आता है। – Wyzard

1

अपनी विधि को अपवाद फेंक दें या नैन वापस आएं।

3

catch अनुभाग में अपवाद फेंको। आप कहीं भी हों promptUserDecimal विधि कॉल, किसी भी अपवाद को पकड़ने और वहाँ संदेश मुद्रित:

public static void main(String[] args) { 

    double d = 0.0; 
    while (double == 0) { 
     try { 
      d = promptUserDecimal(); 
     } catch (NumberFormatException e) { 
      //log the message... 
      d = 0.0; 
     } 
    } 
} 

private static double promptUserDecimal() throws NumberFormatException { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a decimal"); 
    return Double.parseDouble(scan.nextLine()); 
} 

इसका कारण यह है कि आप केवल एक डबल मूल्य पढ़ने से निपटने के बारे promptUserDecimal चिंताओं जाने के लिए एक बेहतर दृष्टिकोण होगा। आपको प्रत्येक वर्ग और विधि को उस विशिष्ट उद्देश्य के लिए अलग करने की कोशिश करनी चाहिए जिसके लिए इसे डिजाइन किया गया था। आप अपनी पकड़ ब्लॉक के भीतर एक अपवाद फेंक कर सकते हैं

double input2; 
try{ 
    //read input2 
}catch(...){ 
    //... log AND assign a value to input2 in case of invalid input 
} 
return input2; 
+0

+1 लेकिन यदि आप वैसे भी 'नंबरफॉर्मेट एक्सेप्शन' फेंकने जा रहे हैं, तो आपको इसे पकड़ने की आवश्यकता नहीं है। इसे पहले स्थान पर न पकड़ें, 'parseDouble' अपवाद फेंक दें। –

+0

@ user1598390 वास्तव में सच। उत्तर अपडेट किया गया। –

3

आप की तरह कुछ की जरूरत है। जैसे कि,

private static double promptUserDecimal() throws OopsException { 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a decimal"); 
    try{ 
     double input2 = Double.parseDouble(scan.nextLine()); 
     return input2; 
    } catch(NumberFormatException e){ 
     System.out.println("Sorry, you provided an invalid option, please try again."); 
     throw new OopsException(); 
    } 
} 

फिर, हर बार जब वे एक अमान्य इनपुट देने के लिए, आप इसे पकड़ने और इसे संभाल तुम कहाँ से विधि कॉल कर सकते हैं।

+0

वेरिएबल घोषित करते समय आप डिफ़ॉल्ट त्रुटि मान असाइन कर सकते हैं। –

0
private static double promptUserDecimal(){ 
    Scanner scan = new Scanner(System.in); 
    System.out.println("Enter a decimal"); 
    double input2 = 0.0; // <-- explicit initialization 
    try{ 
     double input2 = Double.parseDouble(scan.nextLine()); 
    } catch(NumberFormatException e){ 
     System.out.println("Sorry, you provided an invalid option, please try again."); 
    } 
    return input2; 
} 
3

यदि आप चाहते हैं उपयोगकर्ता "पुन: प्रयास करें" करने के लिए, ऐसा लगता है कि आप एक पाश की जरूरत है लगता है:

private static double promptUserDecimal(){ 
    final Scanner scan = new Scanner(System.in); 

    // Ask for input until we get something valid 
    while (true) { // Terminated by return within 
     System.out.println("Enter a decimal"); 
     try { 
      return Double.parseDouble(scan.nextLine()); 
     } catch(NumberFormatException e){ 
      System.out.println("Sorry, you provided an invalid option, please try again."); 
      // No return, so the loop will run again 
     } 
    } 
} 
+1

मेरे पास एक प्रश्न है। यह स्निपेट संकलित है? –

+0

@PaulVargas, यह मेरे लिए संकलित करता है। क्या आपको इसमें कोई त्रुटि दिखाई देती है? – Wyzard

+0

OP: I एक अप्रत्याशित लिपि के लिए इस समाधान की तरह। – user1612272

0

संकलक मुद्दे का समाधान होगा सूचीबद्ध समाधानों में से कुछ है, लेकिन पहला कदम एक कदम पीछे जाएं और पूछने के लिए कि "मुझे लगता है कि एक NumberFormatException होता है घटना में करने के लिए क्या चाहते हैं?"

एक विकल्प संख्याफॉर्मेट अपवाद को पुनर्स्थापित करके या इसे रनटाइम अपवाद में लपेटकर अपवाद को प्रसारित करना है ताकि यह अनचेक हो जाए। इसका मतलब है कि कॉलिंग कोड को इसे संभालना होगा, या उपयोगकर्ता को स्टैकट्रस के साथ प्रस्तुत किया जाएगा। यदि आप इस मार्ग पर जाते हैं तो आपको अपनी विधि में पकड़ने की भी आवश्यकता नहीं है। आप बस विधि हस्ताक्षर पर "नंबरफॉर्मेट अपवाद" फेंक सकते हैं और इसे स्ट्रीम को संभालने दें।

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

मैं विकल्प विकल्प के साथ जाऊंगा, और उपयोगकर्ता को यह बताकर अपवाद को संभालेगा कि scan.nextline + "मान्य डबल के रूप में पहचाना नहीं गया है।"

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

  • कोई संबंधित समस्या नहीं^_^