当用户输入null或空字符串时抛出错误

时间:2015-09-17 13:08:01

标签: c# .net string exception-handling

我正在尝试解决以下问题:

  

您需要创建一个代表产品的名为Product的类。   该类有一个名为Name的属性。 Product类的用户   应该能够获取并设置Name属性的值。然而,   任何将Name的值设置为空字符串或null的尝试   值应引发异常。此外,Product类的用户   不应该访问Product的任何其他数据成员   类。你将如何创建这样一个类?

我创建了以下代码但由于某种原因,当字符串无效时它不会抛出异常:

class Program
{
    static void Main(string[] args)
    {
        Product newProduct = new Product();
        Console.WriteLine("Enter Product name:");
        newProduct.Name = null; //Console.ReadLine();
        Console.WriteLine("Product name is : {0}", newProduct.Name);
        Console.ReadLine();
    }
}

class Product
{
    private string name;
    public string Name
    {
        get
        {
            return this.name;
        }
        set
        {
            if (Name != String.Empty || Name != null)
            {
                name = value;
            }
            else
            {
                throw new ArgumentException("Name cannot be null or empty string", "Name");
            }
        }
    }
}

是不是因为我没有try-catch语句而抛出异常? 我还想知道是否有可能只有没有try语句的catch语句?

3 个答案:

答案 0 :(得分:12)

使用String.IsNullOrEmpty Method (String)。像这样更改set

set
{
      if (!string.IsNullOrEmpty(value))
      {
            name = value;
      }
      else
      {
            throw new ArgumentException("Name cannot be null or empty string", "value");
      }
}

此外,您可以使用String.IsNullOrWhiteSpace Method (String)指示指定的字符串是空,空还是仅由空格字符组成。

答案 1 :(得分:7)

您的if州错了。我们来做一个真值表:

if (value != String.Empty || value != null)
Name = null   True Or False  = True 
Name = "name" True Or True = True
Name = ""     False Or True = True 

您的if语句始终为真

我会重写它:

if (value == String.Empty || value == null)
{
     throw new ArgumentException("Name cannot be null or empty string", "Name");  
}
else
{
     name = value;
}

您可以将Or更改为AND和AND但我认为以上内容更好(下面有不必要的双重否定):

if (value != String.Empty && value != null)
{
   name = value;
}
else
{
    throw new ArgumentException("Name cannot be null or empty string", "value");
}

正如Dmitry Bychenko所说,我没有注意到你没有为value进行测试。 In getters you should use the value property。不是您的属性

的名称

您的例外中的第二个参数(由Dmitry Bychenko再次指出)应为:

  

导致当前异常的参数名称。

MSDN

在您的情况下是字符串"value"

throw new ArgumentException("Name cannot be null or empty string", "value");

答案 2 :(得分:3)

如果您希望 null 上的不同的例外和字符串(通常 null 意味着某些事情是< em>完全错误,当空字符串只是一个格式错误)时:

public string Name {
  get {
    return name;
  }
  set {
    if (null == value)
      throw new AgrumentNullException("value");
    else if (String.Equals(value, ""))
      throw new AgrumentException("Empty values are not allowed.", "value");

    name = value; 
  }
}

如果您不想取消他们:

public string Name {
  get {
    return name;
  }
  set {
    if (String.IsNullOrEmpty(value))
      throw new AgrumentException("Null or empty values are not allowed.", "value");

    name = value; 
  }
}

请注意,在这两种情况下,您必须测试value,而不是属性Name。在您的原始代码中,name(以及Name以及初始值null并且您将获得异常<你试图设置的。