C#程序崩溃

时间:2010-09-20 14:01:02

标签: c#

感谢大家帮我解决1位数和31位问题。

现在,最后一件事......如果文本框中包含非数字字符或根本没有字符,程序将崩溃。

这是整个代码:

private void generate_Click(object sender, EventArgs e)
        {
            int val = 0;

            if (Int32.TryParse(dd.Text, out val))
            {
                if (val > 31) return;
                else if (dd.Text.Length <= 1)
                    return;
            }

            if (Int32.TryParse(MM.Text, out val))
            {
                if (val > 31) return;
                else if (MM.Text.Length <= 1)
                    return;
            }

            if (Int32.TryParse(hh.Text, out val))
            {
                if (val > 31) return;
                else if (hh.Text.Length <= 1)
                    return;
            }

            if (Int32.TryParse(M.Text, out val))
            {
                if (val > 31) return;
                else if (M.Text.Length <= 1)
                    return;
            }

            if (Int32.TryParse(ss.Text, out val))
            {
                if (val > 31) return;
                else if (ss.Text.Length <= 1)
                    return;
            }

            String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text;
            DateTime timestamp = DateTime.ParseExact(dateString, "yyyyddMMhhmmss", CultureInfo.CurrentCulture);
            long ticks = timestamp.Ticks;
            long microseconds = ticks / 10;
            convertedText.Text = microseconds.ToString("X");
        }

我应该放什么? 我知道它有点乱 - 但它有效,这是我的第一个C#应用程序:P 再次感谢!

5 个答案:

答案 0 :(得分:5)

如果您要在日期未解析时返回,则可以跳过所有验证码并使用TryParseExact

private void generate_Click(object sender, EventArgs e) 
{ 
    String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text; 
    DateTime timestamp 
    if (!DateTime.TryParseExact(dateString, "yyyyddMMhhmmss", null, 
                                       DateTimeStyles.None, out timestamp ))
        return;                                   
    long ticks = timestamp.Ticks; 
    long microseconds = ticks / 10; 
    convertedText.Text = microseconds.ToString("X"); 
}

答案 1 :(得分:2)

对于初学者,请将代码包装在try catch块中。它将防止异常自动崩溃程序。您可以捕获异常并通知用户输入存在问题。

然后你可以做类似的事情:

catch
{
   MessageBox.Show("Please enter numbers only.");
}

真的在一个制作应用中,你想要更多地捕捉特定类型的错误。但是,对于刚开始,这将很好。

答案 2 :(得分:0)

这会解决您的特定问题吗?你正在做TryParsing,然后验证大于31或小于1的整数,但如果TryParse失败则不处理。

private void generate_Click(object sender, EventArgs e)
        {
            int val = 0;

            if (Int32.TryParse(dd.Text, out val))
            {
                if (val > 31) return;
                else if (dd.Text.Length <= 1)
                    return;
            }
            else 
            {
                 return;
            }

            if (Int32.TryParse(MM.Text, out val))
            {
                if (val > 31) return;
                else if (MM.Text.Length <= 1)
                    return;
            }
            else 
            {
                 return;
            }

            if (Int32.TryParse(hh.Text, out val))
            {
                if (val > 31) return;
                else if (hh.Text.Length <= 1)
                    return;
            }
            else 
            {
                 return;
            }

            if (Int32.TryParse(M.Text, out val))
            {
                if (val > 31) return;
                else if (M.Text.Length <= 1)
                    return;
            }
            else 
            {
                 return;
            }

            if (Int32.TryParse(ss.Text, out val))
            {
                if (val > 31) return;
                else if (ss.Text.Length <= 1)
                    return;
            }
            else 
            {
                 return;
            }

            String dateString = yyyy.Text + dd.Text + MM.Text + hh.Text + M.Text + ss.Text;
            DateTime timestamp = DateTime.ParseExact(dateString, "yyyyddMMhhmmss", CultureInfo.CurrentCulture);
            long ticks = timestamp.Ticks;
            long microseconds = ticks / 10;
            convertedText.Text = microseconds.ToString("X");
        }

答案 3 :(得分:0)

如果ParseExact的格式不正确,它会在dateString上崩溃 请改用TryParseExact

答案 4 :(得分:0)

我猜你的ParseExact撞毁了这个......但是我并不完全确定......把所有东西包裹起来试试看,或试试几次。然后你可以看到发生了什么并纠正它......

类似的东西:

try{
//Parse something...

}catch(Exception ex)
{
    throw ex; //I usually put a break point here when I'm debugging...
}