2015-06-12 6 views
5

के लिए अजीब अपवाद फेंकता है जब मैं सी # की बात करता हूं तो मैं एक पूर्ण शुरुआतकर्ता हूं। उदाहरणों के माध्यम से सीखने की कोशिश कर रहा है। तो मैंने खुद को एक अच्छा छोटा कैलकुलेटर ट्यूटोरियल पाया है। आखिरी पल तक सब ठीक हो जाता है, कोड काम कर रहा है, लेकिन यह 33 जैसे बहु-अंक इनपुट नहीं लेता है। अंकगणितीय परिचालन चालू/बंद करने के लिए वहां एक बूल स्टेटमेंट है और ट्यूटोरियल प्रशिक्षक ने पाया है कि हमें संख्या इनपुट/बटन प्रेस (button_Click में) से पहले bool = false डालना चाहिए।सी # बूल स्टेटमेंट प्रतीत होता है कि असंगत डबल.परसे (स्ट्रिंग)

उनकी कोड इस तरह दिखता है:

public partial class MainWindow : Window 
{ 
    double value = 0; 
    string operation = ""; 
    bool operation_pressed = false; 

    public MainWindow() 
    { 
     InitializeComponent(); 
    } 

    private void button_Click(object sender, RoutedEventArgs e) 
    { 
     if ((tb.Text == "0") || (operation_pressed == true)) 
      tb.Clear(); 

     operation_pressed = false; 
     Button b = (Button)sender; 
     tb.Text += "\n" + b.Content.ToString(); 
    } 

    private void operator_Click(object sender, RoutedEventArgs e) 
    { 
     Button b = (Button)sender; 
     operation = b.Content.ToString(); 
     value = double.Parse(tb.Text); 
     operation_pressed = true; 
     equation.Content = value + " " + operation; 
    } 

    private void result_Click(object sender, RoutedEventArgs e) 
    { 

     equation.Content = ""; 
     switch(operation) 
     { 
      case "+": 
       tb.Text = "\n" + (value + double.Parse(tb.Text)).ToString(); 
       break; 
      case "-": 
       tb.Text = "\n" + (value - double.Parse(tb.Text)).ToString(); 
       break; 
      case "*": 
       tb.Text = "\n" + (value * double.Parse(tb.Text)).ToString(); 
       break; 
      case "/": 
       tb.Text = "\n" + (value/double.Parse(tb.Text)).ToString(); 
       break; 
      default: 
       break; 
     } 
    } 

    private void CE_Click(object sender, RoutedEventArgs e) 
    { 
     tb.Text = "\n 0"; 
    } 

    private void C_Click(object sender, RoutedEventArgs e) 
    { 
     tb.Clear(); 
     equation.Content = ""; 
     value = 0; 
    } 
} 

यह अच्छी तरह से संकलित करता है।

When converting string to DateTime, parse the string to take the date before putting each variable into the DateTime object.

मैं अभी इतना भ्रमित कर रहा हूँ: लेकिन जब मैं इनपुट करने के लिए एक multidigit संख्या कोशिश करते हैं और एक गणितीय ऑपरेटर के साथ पालन करें, यह संभव है कि कहा गया है value = double.Parse(tb.Text); के लिए एक अपवाद फेंकता है। कोई DateTime भी शामिल नहीं है! और मैं 100% सकारात्मक हूं, सब कुछ ट्यूटोरियल में है। क्या चल रहा है? :/

किसी भी मदद की सराहना की जाएगी!

संपादित

वास्तविक त्रुटि का स्क्रीनशॉट:

The error

+0

तो आप 'tb.text' में multidigit संख्या और गणित ऑपरेटर इनपुट करते हैं ?? – Adam

+3

मैंने पहले कभी ऐसा अपवाद संदेश नहीं देखा है। क्या आप वाकई वास्तविक त्रुटि प्राप्त कर रहे हैं? और यह वास्तव में उस रेखा से आ रहा है? मैं * अत्यधिक संदेह * 'डबल। पर्स()' एक अपवाद के रूप में फेंक रहा है। – David

+0

इस डबल कुछ कोशिश करें = डबल। पर्स (tb.Text); मूल्य = SomeValue; क्या आपको अभी भी पार्स में त्रुटि मिलती है? क्या मूल्य संपत्ति किसी संपादक से जुड़ी है? –

उत्तर

5

पहले में इस कोड का प्रयास करें, तो आप गलत तरीके से डिबगर की व्याख्या कर रहे हैं।

When converting string to DateTime, parse the string to take the date before putting each variable into the DateTime object.

सूचना है कि यह कैसे के रूप में "समस्या निवारण टिप्स" सूचीबद्ध है: यह नहीं त्रुटि संदेश है। अधिकांश मामलों में, आप इसे अनदेखा कर सकते हैं। त्रुटि संदेश स्वयं एक ऐसी भाषा में है जिसे मैं नहीं जानता, इसलिए मैं जो कहता हूं उससे बात नहीं कर सकता। लेकिन FormatException अनिवार्य रूप से इसका मतलब है कि आप उस मान को पार्स करने का प्रयास कर रहे हैं जिसे पार्स नहीं किया जा सकता है।

आपकी स्क्रीन शॉट कुछ जानकारी में कटौती करता है, लेकिन tb.Text का मूल्य क्या है? क्या यह उन "+" स्ट्रिंग्स में से एक है? यदि ऐसा है, तो यह आपकी समस्या है।

"+" को संख्यात्मक मान के रूप में पार्स नहीं किया जा सकता है, क्योंकि "+" कोई संख्या नहीं है।

Parse के बजाय TryParse का उपयोग करके आप अपने कोड को थोड़ा अधिक प्रतिरोधी बना सकते हैं। कुछ इस तरह: if ब्लॉक दर्ज नहीं हुआ

double result; 
if (!double.TryParse(tb.Text, out result)) 
{ 
    // couldn't parse 
} 

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

बिंदु है, tb.Text में एक गैर-संख्यात्मक मान होता है जिसे आप एक संख्यात्मक मान में बदलने की कोशिश कर रहे हैं। इसलिए त्रुटि।

+0

बात यह है - यह काम करता है, जब 'operation_pressed = false;' 'result_Click' में होता है, लेकिन यह' बटन_Click' में होने पर (और उछाल जाता है) नहीं होता है। और ट्यूटोरियल द्वारा निर्णय लेना चाहिए, इसे मल्टीडिजिट संख्याओं को स्वीकार करने के लिए होना चाहिए मूल्य उस वीडियो के लिए काम करता है जिसने वीडियो ट्यूटोरियल बनाया है, मैं निम्नलिखित हूं। – roonroon

+0

@roonroon: "यह काम करता है" और "यह काम नहीं करता" एक बहुत व्यापक और सामान्य कथन है, और मुझे डर है कि कोड में अधिक मूल्य नहीं है। मैं आपके द्वारा अनुसरण किए जा रहे ट्यूटोरियल से बात नहीं कर सकता या यहां तक ​​कि आपका एप्लिकेशन क्या करने का इरादा रखता है। लेकिन विशिष्ट अपवाद होता है क्योंकि आप किसी संख्या में गैर-संख्यात्मक स्ट्रिंग को पार्स करने का प्रयास कर रहे हैं। हालांकि आप इसे रोक सकते हैं, आपको इसे रोकने की जरूरत है। हो सकता है कि आप गलत मान पार्स कर रहे हों, हो सकता है कि इनपुट को गैर-संख्यात्मक मानों की अनुमति न दे, शायद कुछ तर्क कहीं और गलत है ... मुझे नहीं पता। आपके कार्यक्रम के तर्क को समझने के लिए आप पर निर्भर है। – David

+0

@roonroon tb.Text का मान क्या होता है जब यह दुर्घटनाग्रस्त हो जाता है? क्या एक पूर्णांक है या नहीं? आपके पीसी की भाषा सेटिंग्स के आधार पर आपको TryParse के अधिभार का उपयोग करना पड़ सकता है। इसे जांचें: https://msdn.microsoft.com /en-us/library/ew0seb73(v=vs.110).aspx –

0

operator_Click घटना सभी के

Button b = (Button)sender; 
operation = b.Text; 
value = Convert.ToDouble(tb.text) 
+0

यह कहता है कि 'बटन बी' में '.Text' परिभाषा नहीं है:/ – roonroon

+0

ठीक है तो आपके पास उसी कोड का उपयोग करें, लेकिन जैसा कि मैंने उल्लेख किया है, बस रूपांतरण करें। उदा। मूल्य = कनवर्ट करें। दोहरी (tb.Text); – hdkhardik

+0

'कन्वर्ट करें। दोहरी' एक ही अपवाद को 'डबल। पर्स' के रूप में फेंक देगा। – David

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