none
关于C#的异常处理!新手疑问! RRS feed

  • 问题

  •   我做了一个小东西。代码如下:

        using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Text;
    using System.Windows.Forms;

    namespace 超市找零系统
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }

            private void button1_Click(object sender, EventArgs e)
            {
                int zfc, xfc, zl;
                int wushi, ershi, shi, wu, yi;
                zfc= int.Parse(_zf.Text);
                xfc= int.Parse(_xf.Text);
                if (zfc < 0 || xfc< 0)
                    MessageBox.Show("数据输入有误!", MessageBoxButtons.OK);
                zl = zfc - xfc;
                wushi = zl / 50;
                ershi = (zl - wushi*50) / 20;
                shi = (zl - wushi * 50 - ershi * 20) / 10;
                wu = (zl - wushi * 50 - ershi * 20 - shi * 10) / 5;
                yi = zl - wushi * 50 - ershi * 20 - shi * 10 - wu * 5;
                _zl.Text = zl.ToString();
                ws.Text = wushi.ToString();
                es.Text = ershi.ToString();
                s.Text = shi.ToString();
                y.Text = yi.ToString();
                w.Text = wu.ToString();
                 
                   
              

     

     

            }

            private void textBox6_TextChanged(object sender, EventArgs e)
            {

            }

            private void button2_Click(object sender, EventArgs e)
            {
                _zf.Text = "";
                _xf.Text = "";
                _zl.Text = "";
                ws.Text = "";
                es.Text = "";
                s.Text = "";
                w.Text = "";
                y.Text = "";
            }

            private void button3_Click(object sender, EventArgs e)
            {
                this.Close();
            }

     

     

     

        }
    }

      问题是怎么用异常处理来解决_zf或者_xf文本框中无输入出错的问题?就是说,如果上面那两个文本框没有输入程序就会出错。但是我没法解决!请大家帮帮忙!

    2010年12月10日 5:22

答案

  • dear
    我门明明打 TryParse() ,你用Parse因为资料格式不正确,所以会抛出例外讯习,转型之前要先判断资料格式是否正确

        private void button1_Click(object sender, EventArgs e)
        {
          if (string.IsNullOrEmpty(textBox1.Text) || string.IsNullOrEmpty(textBox2.Text))
          {
            MessageBox.Show("资料不能为空");
            return;
          }
          int a, b, c;
          if (!int.TryParse(textBox1.Text, out a))
          {
            MessageBox.Show("资料格式不符");
            return;
          }
          if (!int.TryParse(textBox2.Text, out b))
          {
            MessageBox.Show("资料格式不符");
            return;
          }
          c = a + b;
          textBox3.Text = c.ToString();
    
      
        }
    
    你也可以用try来判断转型是否成功,但不建议那样做,还是建议使用正确的逻辑判断
          try
          {
            int.Parse(textBox1.Text);
          }
          catch (Exception)
          {
    
          }
    



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已标记为答案 tobug 2010年12月10日 9:14
    2010年12月10日 8:16

全部回复

  • dear
    你应该先判断_zf.Text以及_xf.Text是否为空
    if (string.IsNullOrEmpty(_zf.Text) || string.IsNullOrEmpty(_xf.Text))
    {
     MessageBox.Show("资料不得为空")
    return; }

    资料非空时,也要检查资料格式是否正确
    int zfc;
    int xfc;
    if (!int.TryParse(_zf.Text,out zfc))
    {
     MessageBox.Show("资料格式不符")
    return; } if (!int.TryParse(_xf.Text,out xfc)) {  MessageBox.Show("资料格式不符")
    return; }



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    2010年12月10日 6:16
  • 在调用 zf.Text 和 xf.Text 之前,加一些 if 语句,或者把 int.Parse 改成 int.TryParse。

    例如:

    if (string.IsNullOrEmpty(zf.Text)) {
        MessageBox.Show("Text value cannot be empty.");
    }

    或者

    int value;
    if (!int.TryParse(zf.Text, out value)) {
        MessageBox.Show("Invalid input.");
    }


    Mark Zhou
    2010年12月10日 6:30
  • 不好意思,我试试了还是没法解决。
    2010年12月10日 6:48
  •         private void button1_Click(object sender, EventArgs e)
            {
                int a, b, c;
                a = int.Parse(textBox1.Text);
                b = int.Parse(textBox1.Text);
                c = a + b;
                textBox3.Text = c.ToString();

        麻烦各位看下,在上面的小例子中该怎么插入代码解决?

         利用你们说的哪几种方法!我调试的时候显示:

           未处理FormatException

         输入字符串的格式不正确。

       排错提示:

        确保方法参数的格式正确。

        将一个字符串转换为 Date Time 时,先分析该字符串以获取信息然后再将每个变量放置到 Date Time 对象中。

    2010年12月10日 7:00
  • dear
    我门明明打 TryParse() ,你用Parse因为资料格式不正确,所以会抛出例外讯习,转型之前要先判断资料格式是否正确

        private void button1_Click(object sender, EventArgs e)
        {
          if (string.IsNullOrEmpty(textBox1.Text) || string.IsNullOrEmpty(textBox2.Text))
          {
            MessageBox.Show("资料不能为空");
            return;
          }
          int a, b, c;
          if (!int.TryParse(textBox1.Text, out a))
          {
            MessageBox.Show("资料格式不符");
            return;
          }
          if (!int.TryParse(textBox2.Text, out b))
          {
            MessageBox.Show("资料格式不符");
            return;
          }
          c = a + b;
          textBox3.Text = c.ToString();
    
      
        }
    
    你也可以用try来判断转型是否成功,但不建议那样做,还是建议使用正确的逻辑判断
          try
          {
            int.Parse(textBox1.Text);
          }
          catch (Exception)
          {
    
          }
    



    秘訣無它,唯勤而已 http://www.dotblogs.com.tw/yc421206/
    • 已标记为答案 tobug 2010年12月10日 9:14
    2010年12月10日 8:16
  • 您好

    您可以做以下動作

    1. 參考 [C#][VB.NET]限制TextBox 只能輸入數字,以及限制不能使用快速鍵 限制 TextBox 只能輸入數字

    2. 在您的程式碼包上 Try - Catch http://msdn.microsoft.com/zh-tw/library/0yd65esw(v=vs.80).aspx

    3. 使用 int.TryParse,參考 如何:确定字符串是否表示数值(C# 编程指南)


    歡迎參觀我的Blog.NET菜鳥自救會
    2010年12月10日 8:57
  • 前辈:

    你使用的return方法固然方便,但它只能终止所在的代码块,而与它所在代码块并行的代码块仍然会被执行。换种说法吧。假如主函数调用了两个子函数,分别是A和B,然后A中执行return后只会终止A的执行,B依然会被执行。

    至于使用抛异常的方法,我实验过,点掉messagebox显示后,并行的代码块依然会执行。

    是否有好的方法可以让代码在出现异常后停止或恢复到初始状态?有好的想法的话,大家可以一起讨论讨论

    2015年1月7日 8:07