代码之家  ›  专栏  ›  技术社区  ›  user1897748

在c中捕获异常的问题#

  •  0
  • user1897748  · 技术社区  · 11 年前

    我有一个有两个项目的组合框。我还有一个按钮,当选择其中一个项目时,它会打开一个新表单。但是,如果没有选择任何项,则会出现异常(nullpointer)。我试图捕捉这个异常并显示一个提示用户选择其中一个项目的mbox(但没有成功)。

    以下是按钮点击偶数的代码:

    if (labelGrid.Text == "Member" && cbTable.SelectedItem.ToString().Equals("Workout"))
            {
                string name;
                string ss;
                foreach (DataGridViewRow item in this.dtGrid1.SelectedRows)
                {
                    ss = dtGrid1.CurrentCell.Value.ToString();
                    name = dtGrid1.SelectedCells[1].Value.ToString();
                    BookMemberWorkout bmw = new BookMemberWorkout(ss, name);
                    bmw.Label2.Text = ss;
                    bmw.Label1.Text = name;
                    bmw.ShowDialog();
                }
            }
    
    3 回复  |  直到 11 年前
        1
  •  2
  •   Daniel Hilgarth Richard    11 年前

    在非异常情况下,您不应该使用异常进行流控制。用户没有选择任何内容的情况肯定不是例外。

    正确的方法是 null 检查:

    if(cbTable.SelectedItem == null)
    {
        // Show message box
    }
    else
    {
        // Your current code
    }
    

    为什么您的异常处理代码不起作用是不可能回答的,因为您的问题中没有包含它。

        2
  •  0
  •   Stefano Altieri    11 年前

    我认为问题在于:

    ss = dtGrid1.CurrentCell.Value.ToString();
    

    您不能确定该值不是null,所以在调用.ToString()之前应该检查它。

    您可以使用RequiredValidator来执行javascript验证,而不是使用消息框,从而避免无用的回发。

        3
  •  0
  •   bytefire    11 年前

    从性能和可读性的角度来看,我建议在组合框中检查所选值,而不是像这样捕获异常

    if(cbTable.SelectedItem == null)
    {
             MessageBox.Show("Please select a value in the combo box.");
             return;
    }
    
    if (labelGrid.Text == "Member" && cbTable.SelectedItem.ToString().Equals("Workout"))
            {
                string name;
                string ss;
                foreach (DataGridViewRow item in this.dtGrid1.SelectedRows)
                {
                    ss = dtGrid1.CurrentCell.Value.ToString();
                    name = dtGrid1.SelectedCells[1].Value.ToString();
                    BookMemberWorkout bmw = new BookMemberWorkout(ss, name);
                    bmw.Label2.Text = ss;
                    bmw.Label1.Text = name;
                    bmw.ShowDialog();
                }
            }
    

    然而,要回答您的特定查询,您可以 NullReferenceException 这样地:

     try{
            if (labelGrid.Text == "Member" && cbTable.SelectedItem.ToString().Equals("Workout"))
            {
                string name;
                string ss;
                foreach (DataGridViewRow item in this.dtGrid1.SelectedRows)
                {
                    ss = dtGrid1.CurrentCell.Value.ToString();
                    name = dtGrid1.SelectedCells[1].Value.ToString();
                    BookMemberWorkout bmw = new BookMemberWorkout(ss, name);
                    bmw.Label2.Text = ss;
                    bmw.Label1.Text = name;
                    bmw.ShowDialog();
                }
            }
        }
        catch(NullReferenceException ex)
        {
             MessageBox.Show("Please select a value in the combo box.");
        }